我的页面上有一些文本框可以为空,因为它们是可选的,我有这个DAL代码
parameters.Add(new SqlParameter("@FirstName", FirstName));
parameters.Add(new SqlParameter("@LastName", LastName));
parameters.Add(new SqlParameter("@DisplayName", DisplayName));
parameters.Add(new SqlParameter("@BirthDate", BirthDate));
parameters.Add(new SqlParameter("@Gender", Gender));
Run Code Online (Sandbox Code Playgroud)
任何这些字段都可以为空.问题是当我们收到空的时候Procedure XXX requires @FirstName which was not supplied
然后我将代码更改为
parameters.Add(new SqlParameter("@FirstName", String.IsNullOrEmpty(FirstName) ? DBNull.Value : (object)FirstName));
parameters.Add(new SqlParameter("@LastName", String.IsNullOrEmpty(LastName) ? DBNull.Value : (object) LastName));
parameters.Add(new SqlParameter("@DisplayName", String.IsNullOrEmpty(DisplayName) ? DBNull.Value : (object) DisplayName));
parameters.Add(new SqlParameter("@BirthDate", BirthDate.HasValue ? (object)BirthDate.Value : DBNull.Value));
parameters.Add(new SqlParameter("@Gender", String.IsNullOrEmpty(Gender) ? DBNull.Value : (object) Gender));
Run Code Online (Sandbox Code Playgroud)
但是这对我来说看起来很麻烦,特别是object因为三元语句要求两个值都是相同的类型.
为什么NULL数据库中没有处理空字符串或空字符串?如果我必须将其转换DBNull.Value为更清洁的方式吗?将值保存为数据库中的空字符串可能有所帮助,但NULL在数据库中查询也会变得混乱
请就常见做法或与此有关的事情提出建议.
如何在参数varbinary数据类型中添加空值?
当我执行以下代码时:
using (SqlConnection myDatabaseConnection1 = new SqlConnection(myConnectionString.ConnectionString))
{
using (SqlCommand mySqlCommand = new SqlCommand("INSERT INTO Employee(EmpName, Image) Values(@EmpName, @Image)", myDatabaseConnection1))
{
mySqlCommand.Parameters.AddWithValue("@EmpName", textBoxEmpName.Text);
mySqlCommand.Parameters.AddWithValue("@Image", DBNull.Value);
myDatabaseConnection1.Open();
mySqlCommand.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下内容System.Data.SqlClient.SqlException:
不允许从数据类型nvarchar到varbinary(max)的隐式转换.使用CONVERT函数运行此查询.
有没有人喜欢如何检查一个值是DBNull什么?我发现这两个陈述给了我想要的结果,但只是想知道是否有偏好?
if (any is System.DBNull)
与...一样:
if (any == System.DBNull.Value)
谢谢!
我正在使用SQL Server 2008存储过程使用以下语法创建新记录:
cmd.Parameters.Add("@photo", DBNull.Value)
cmd.ExecuteNonQuery()
Run Code Online (Sandbox Code Playgroud)
但结果是:
Operand type clash: nvarchar is incompatible with image
Run Code Online (Sandbox Code Playgroud)
照片不是唯一的参数,但是唯一的图像一,我没有传递nvarchar但是空值,我错过了什么?
我经常要处理连接到网格控件的DataTables,自定义更新似乎总会产生很多与DBNull.Value相关的代码.我在这里看到了类似的问题,但认为必须有一个更好的答案:
我找到的是我倾向于在方法中封装我的数据库更新,所以我最终得到如下代码,我将DBNull.value移动到可以为空的类型,然后返回更新:
private void UpdateRowEventHandler(object sender, EventArgs e)
{
Boolean? requiresSupport = null;
if (grdMainLevel1.GetFocusedRowCellValue(colASRequiresSupport) != DBNull.Value)
requiresSupport = (bool)grdMainLevel1.GetFocusedRowCellValue(colASRequiresSupport);
AdditionalSupport.UpdateASRecord(year, studentID, requiresSupport)
}
internal static void UpdateASRecord(
string year,
string studentID,
bool? requiresSupport)
{
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@year", SqlDbType.Char, 4) { Value = year });
parameters.Add(new SqlParameter("@student_id", SqlDbType.Char, 11) { Value = studentID });
if (requiresSupport == null)
parameters.Add(new SqlParameter("@requires_support", SqlDbType.Bit) { Value = DBNull.Value });
else
parameters.Add(new SqlParameter("@requires_support", SqlDbType.Bit) { Value = requiresSupport }); …Run Code Online (Sandbox Code Playgroud) 我正在尝试向DataRowC#中的现有列添加列.之后,该列将填充我的数据库中的单个值.
DataRow dr已存在且列"COLNAME"也存在.
comTBP是我的SqlCommand.
dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar());
Run Code Online (Sandbox Code Playgroud)
如果我的数据库中有值,并且ExecuteScalar()可以获得该值,则一切正常.如果我在我的开发服务器(本地)上测试此代码,如果ExecuteScalar()返回null或DBNull并且我的新列的值为0,它也可以工作.但是如果我将代码部署到生产服务器,则会出现问题.如果我做同样的事情,使用相同的数据库,它会抛出一个异常,并显示一条消息,它无法将DBNull转换为Int32.
我的问题是为什么这个错误出现在生产服务器上而不是我的本地开发服务器上?
我有两个DateTime对象,BirthDate和HireDate.它们被正确格式化为字符串,当我将它们传递给我的数据访问层时,需要将它们解析为DateTime对象.
DateTime hD = DateTime.Parse(hire);
DateTime bD = DateTime.Parse(birth);
//incase of a datestring being passed through
dateStringPassed = "7/2/1969";
Run Code Online (Sandbox Code Playgroud)
但有时,字符串hire和birth为空或空"",如果代码运行这样的,我是从解析空字符串得到出现FormatException错误.如何管理空解析并允许DateTime(如果为空或null)被接受为DBNull.Value?
我仍然无法管理用户没有通过DateTime字符串,然后解析崩溃我的代码.
我的出生日期参数如下,检查变量是否为null,然后使用DBNull.Value.
花费更多时间在PowerShell中提取SQL数据.遇到[System.DBNull] :: Value以及PowerShell在比较期间如何处理这些问题.
以下是我看到的行为示例以及变通方法
#DBNull values don't evaluate like Null...
if([System.DBNull]::Value){"I would not expect this to display"}
# The text displays.
if([string][System.DBNull]::Value){"This won't display, but is not intuitive"}
# The text does not display.
#DBNull does not let you use certain comparison operators
10 -gt [System.DBNull]::Value
# Could not compare "10" to "". Error: "Cannot convert value "" to type "System.Int32". Error: "Object cannot be cast from DBNull to other types.""
[System.DBNull]::Value -gt 10
# Cannot compare "" because it …Run Code Online (Sandbox Code Playgroud) 我正在使用数据集从数据库中提取数据.连续的一个领域是NULL.我知道这个.但是,以下vb.net代码会抛出StrongTypingException(在数据集设计器中的自动生成的get_SomeField()方法中):
If Not IsDBNull(aRow.SomeField) Then
'do something
End If
编辑:If aRow.SomeField is DBNull.Value Then也返回相同的错误.哎呀.
sdr是我的sqldatareader,我想检查一个十进制类型的curPrice值是否为null.
inrec.curPrice = sdr.IsDBNull(7) ? (decimal?)null : sdr.GetDecimal(7);
这是我收到的错误消息:
无法隐式转换类型'decimal?' 到'十进制'.存在显式转换(您是否错过了演员?)
哪里出错了,请有人告诉我.
dbnull ×10
c# ×6
.net ×4
ado.net ×2
parameters ×2
vb.net ×2
casting ×1
datetime ×1
image ×1
null ×1
parsing ×1
powershell ×1
sql ×1
sql-server ×1
winforms ×1