在string.Format()中无法传递空值。

4

我有一个名为cmbCity的ComboBox,它的数据源是DisplayMember "CityName"(字符串类型),并且ValueMember是 "ValueID"(数字类型)。

现在,对于更新dataTable,我有一个查询。

string query = string.Format("Update TableName Set StringTypeColmName = '{0}' , NumberTypeColmName = {1}", 
                             "StringValue", 
                             !string.IsNullOrEmpty(cmbCity.Text) ? cmbCity.SelectedValue : DBNull.Value);`. 

如果用户从中选择值,那么它会正常工作。我通过获取值,但如果用户没有选择任何值,则我尝试在数据库中传递空值作为该字段的值,但在格式化字符串后,我得到像这样的值

Update TableName Set StringTypeColmName = 'StringValue' , NumberTypeColmName = " 

在这个输出字符串中没有空值,并且在执行查询时我得到了异常“UPDATE语句中的语法错误”。请问如何将空值添加到输出查询中。我正在使用MS-Access数据库和VS2010。
2个回答

8

您应该绝对不使用字符串格式化来构建参数化的SQL查询。相反,使用相应的类,例如:

using (var cmd = new OleDbCommand("Update TableName Set StringTypeColmName = ?, NumberTypeColmName = ?", connection))
{
    cmd.Parameters.AddWithValue("string", "StringValue");
    cmd.Parameters.AddWithValue("num", !string.IsNullOrEmpty(cmbCity.Text) ? cmbCity.SelectedValue : DBNull.Value);

    cmd.ExecuteNonQuery();
}

由于使用数据库驱动程序来处理参数的替换,即使对值进行ToString()操作会导致空字符串,这样做实际上是安全的。


抱歉,如果这些都是错误的话,我仍在努力弄清楚如何正确地使用OleDbCommand的参数。然而,总体思路仍然有效。 - Joey
是的,这也是更新datatable的一种方式,但在列数较多的情况下,我更喜欢使用格式化字符串而不是将参数传递给查询..! 这将减少代码并增加代码可读性.. 在这种情况下,ToString()有效,因为我已经添加了相同的IsNullOrEmpty()检查。 - Ankush Madankar

5
这应该可以运行,如果值不存在,则应传递“null”字符串:
string.Format("Update TableName Set StringTypeColmName = '{0}' , NumberTypeColmName = {1}", 
"StringValue", !string.IsNullOrEmpty(cmbCity.Text) ? cmbCity.SelectedValue.ToString() : "null");

2
在这个查询中,比较发生在哪里? - gzaxx
1
是的,它正在工作,谢谢您的回答。我会在5分钟后将其标记为答案! - Ankush Madankar
1
@AnkushMadankar,老兄,别担心,这是不公平的。我们会给你点赞的。 - C Sharper
1
我给Navat点了赞并标记了答案。 - Ankush Madankar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接