我有以下代码
foreach (DataRowView dr in Data)
{
if (dr == System.DBNull.Value)
{
nedID = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到以下错误操作符==不能应用于类型System.Data.DataRowView和操作数System.DBNull
请有人建议我如何检查值是否为空或DBNULL
我对.NET中的空值和变量有点困惑.(VB首选)
有没有办法检查任何给定变量的"nullness",无论它是对象还是值类型?或者我的空检查是否必须始终预测它是在检查值类型(例如System.Integer)还是对象?
我想我正在寻找的是一个检查所有可能类型的无效的函数.也就是说,任何类型的变量
a)自从宣布以来从未被赋予价值
b)从数据对象(来自数据库)中分配了一个空值
c)被设置为等于另一个为null的变量值
d)设置为从未设置或过期的ASP.NET会话/应用程序变量.
在.NET中处理空方案时是否有一般的最佳实践?
更新:当我谈到一个值为"null"的值类型时,我真正的意思是一个值类型,它从未设置过,或者在某个点设置为等于或从空对象转换.
我一直认为DbNull.value是一个单身人士.因此你可以做这样的事情:
VB.NET:
If someObject Is DbNull.Value Then
...
End if
Run Code Online (Sandbox Code Playgroud)
C#:
If (someObject == DbNull.Value)
{
...
}
Run Code Online (Sandbox Code Playgroud)
但是最近,我使用XmlSerialiser序列化了一个DbNull实例,突然间它不再是单例了.类型比较操作(如C#(obj是DBNull))工作正常.
代码如下:
[Serializable, System.Xml.Serialization.XmlInclude(typeof(DBNull))]
public class SerialiseMe
{
public SerialiseMe() { }
public SerialiseMe(object value)
{
this.ICanBeDbNull = value;
}
public Object ICanBeDbNull { get; set; }
}
public void Foo()
{
var serialiseDbNull = new SerialiseMe(DBNull.Value);
var serialiser = new System.Xml.Serialization.XmlSerializer(typeof(SerialiseMe));
var ms = new System.IO.MemoryStream();
serialiser.Serialize(ms, serialiseDbNull);
ms.Seek(0, System.IO.SeekOrigin.Begin);
var deSerialisedDbNull = (SerialiseMe)serialiser.Deserialize(ms);
// Is false, WTF!
var equalsDbNullDeserialised = …Run Code Online (Sandbox Code Playgroud) 从行中选择时出现错误.AsEnumerable().我使用以下代码...
var rows = ds.Tables[0].AsEnumerable();
trafficData = rows.Select(row => new tdDataDC
{
CalculationCount = row.Field<Int64>("biCalculationCountSeqID")
, Zone = row.Field<Int16>("siFkZoneId")
, Miles = row.Field<decimal>("dcMiles")
, Plaza = row.Field<Int16>("siFkPlazaId")
, VehicleCount = row.Field<int>("iVehicleCount")
});
Run Code Online (Sandbox Code Playgroud)
大多数情况下它运行良好,但是当数据库中有NULLS时,我收到此错误"无法将DBNull.Value强制转换为'System.Int16'.请使用可空类型.."如何更正此问题?我不希望我的datacontracts有Nullable类型,我想使用三元组或其他东西,如果值为NULL,只需使用0.这可能吗?
谢谢你的帮助,
~kk
我需要解析a中的值DataRow并将其分配给另一个DataRow.如果输入有效,那么我需要将其解析为a double,否则DBNull为输出添加一个值.我正在使用以下代码:
public double? GetVolume(object data)
{
string colValue = data == null ? string.Empty : data.ToString();
double volume;
if (!Double.TryParse(colValue.ToString(), out volume))
{
return null;
}
return volume;
}
public void Assign(DataRow theRowInput,DataRow theRowOutput)
{
double? volume = GetVolume(theRowInput[0]);
if(volumne.HasValue)
theRowOutput[0] = volume.value;
else
theRowOutput[0] = DbNull.Value;
return theRowOutput;
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
我有一个带有非null"quantity"(十进制)和"status"(int)列的Product表,我在这个表上创建了一个带有以下case表达式的视图:
SELECT P.ProductTypeId,
(CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity,
...
FROM Product P
Run Code Online (Sandbox Code Playgroud)
ProductTypeId被正确推断为非null.但是,即使基础列不可为空,也会将此视图的"数量"列推断为可为空.这对我没有任何意义.
我可以使用ISNULL/COALESCE在这种情况下提供默认值并强制不可为空,但是没有有意义的默认值,这不应该从我理解的第一位发生.有什么想法发生了什么?
我正在第一次尝试从 C# 访问 Oracle。我发现 Oracle 不喜欢VarChar参数具有值null(C#)。我本来希望会有一些隐式转换,但我很欣赏这种差异。
所以我需要捕获这些空值并提供DBNull.Value,当然吗?最明显的方法是使用合并运算符??:
param myParm = myObject.MyProperty ?? DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
但它不接受System.DBNull... 的值,所以我必须使用:
param myParm = myObject.MyProperty ?? DBNull.Value.ToString();
Run Code Online (Sandbox Code Playgroud)
...这肯定与以下内容相同:
param myParm = myObject.MyProperty ?? String.Empty;
Run Code Online (Sandbox Code Playgroud)
..这也有效。
但我一直明白,根据 ANSI SQL 规则,空字符串 ("") != NULL 值...但它似乎在 Oracle 中。
无论如何,我的问题是,处理空字符串值的情况的最佳实用或理论方法是什么?是否有我尚未确定的巧妙替代方案?或者这只是我们刚刚接受的 Oracle 的另一个特质?
我正在尝试使用数据库表中的值填充类对象.该someObject.Property字段是可以为null的int类型.
someObject.Property = Convert.ToInt32(dbReader["SomeField"]);
Run Code Online (Sandbox Code Playgroud)
所以,如果SomeField是null,Convert会给出DBNull错误.我应该使用一种特定的方法吗?
我想创建一个存储过程(在SQL Server 2008 R2中),它将根据表的PK更新表中的记录.
例如,存储过程将具有四个参数:
@ID int,
@Name nvarchar(50),
@Email nvarchar(80),
@Phone nvarchar(20)
Run Code Online (Sandbox Code Playgroud)
如果调用者没有为一个(或多个)参数传递任何内容,我如何确定存储过程的调用者是否为一个(或多个)参数传递NULL值?
C#调用者示例:
来电指定NULL为@Phone:
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "EditPerson";
cmd.Parameters.AddWithValue("@ID", id);
cmd.Parameters.AddWithValue("@Name", 'Frank');
cmd.Parameters.AddWithValue("@Email", 'frank@frank.com');
cmd.Parameters.AddWithValue("@Phone", DBNull.Value);
DatabaseManager.instance.ExecuteScalarQuery(cmd);
}
Run Code Online (Sandbox Code Playgroud)
调用者忽略@Phone参数:
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "EditPerson";
cmd.Parameters.AddWithValue("@ID", id);
cmd.Parameters.AddWithValue("@Name", 'Frank');
cmd.Parameters.AddWithValue("@Email", 'frank@frank.com');
DatabaseManager.instance.ExecuteScalarQuery(cmd);
}
Run Code Online (Sandbox Code Playgroud)
我在这里要完成的是,如果调用者为参数显式指定NULL值,那么我将使用NULL值更新记录.但是,如果用户明确忽略传递参数,则UPDATE查询将保留已为特定记录设置的字段/列的值(即查询不会更新该特定列).
我想我可以指定默认值,可以安全地假设调用者永远不会使用 - 如下所示:
@ID int,
@Name nvarchar(50) = …Run Code Online (Sandbox Code Playgroud) 我编写了一个实用程序来处理为手动sql查询添加数据参数的值.消费看起来像
utility.Add("SELECT * FROM MyTable WHERE MyColumn = {0}", myVariable, DBType.TheType);
Run Code Online (Sandbox Code Playgroud)
要么
utility.Add("UPDATE MyTable SET MyColumn = {0}", myVariable, DBType.TheType);
Run Code Online (Sandbox Code Playgroud)
如何处理myVariable的空值?
可选的红利问题:如果这些论点是由三位政治候选人提出的,他们的政党会是什么?(请说明这些政党的母国)