如何向数据库插入空值?

12

你好,我正在尝试根据GridView的DataKeys值在数据库列中插入null(如果为""则插入null)。但是,我在数据库列中得到了一个空格' '。

string sbcId = gvTest.DataKeys[gr.RowIndex]["myColumn"].ToString();
 insgnp.Parameters.Add(new OleDbParameter("EMPID", (sbcId==""?DBNull.Value.ToString():sbcId)));

你看到实际执行的T-SQL了吗?(例如使用SQL Profiler)。ToString可能会放入''。但是你说有一个空格' ',我不知道它怎么可能发生。更可能的是sbcId!=“”,而是==“ ”。 - RPM1984
谢谢RPM1984。我正在使用DB2。似乎在数据库列中使用ToString()被某种方式翻译成了' '。 - Zo Has
8个回答

25

您需要重写您的代码:

if(string.IsNullOrEmpty(sbcId))
    Parameters.Add(new OleDbParameter("EMPID", DBNull.Value)); 
else
    Parameters.Add(new OleDbParameter("EMPID", sbcId)); 

你的三元if语句存在问题,它的返回类型必须始终相同,这就是为什么你不能使用它(字符串和DbNull.Value不兼容)。


谢谢klausbyskov。那个非常有效!=)你有什么提示,为什么数据库中的列即使字符串为空也有值''? - Zo Has
为什么会抛出pictureBox1.Tag != null ? ImageOperations.ImageToBytes(pictureBox1.Image) : DBNull.Value的异常:特性“目标类型化条件表达式”在C# 7.3中不可用。请使用9.0或更高版本的语言。 - paraJdox1
我必须使用if else来使其工作。我正在使用.net框架。这只适用于.net core吗? - paraJdox1

10

使用 DBNull.Value 而不是 DBNull.Value.ToString。在 .NET 中,对于其他参数集合类型,仅使用 null 也可以,但我对 OleDbParameter 不太确定。

至于三元运算符,请勿将其强制转换为字符串,而是将字符串强制转换为对象:

sbcId=="" ? DBNull.Value : (object)sbcId

谢谢Jon。你说得对,唯一的问题是将其转换为字符串。 - Zo Has
1
啊,关于类型转换加了点东西。 - Jon Hanna
谢谢,那也很有帮助。我点赞你,因为答案已经被标记了。 - Zo Has

5

您需要使用DBNull.Value而不是DBNull.Value.ToString()

DBNull.Value.ToString()的结果是''

这个程序会产生

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("'{0}'", DBNull.Value.ToString());
        }
    }
}

alt text


谢谢Preet,虽然问题已经解决了,但我很困惑为什么数据库列会有“”而字符串是“''”? - Zo Has
表的DDL是什么?它有触发器吗? - Preet Sangha
@ZoHas,因为他使用的单引号是由双引号声明的文本,并且污染了结果,当使用字符串格式时,您不需要将变量{0}封装在引号中...即Console.WriteLine("{0}", DBNull.Value.ToString());就足够了。 - LokizFenrir

1

我更喜欢使用扩展方法来处理,而不是多个if语句。这样可以考虑到null或空字符串值。同时也可以使其可重用。

    public static object GetDBNullOrValue<T>(this T val)
    {
        bool isDbNull = true;
        Type t = typeof(T);

        if (Nullable.GetUnderlyingType(t) != null)
            isDbNull = EqualityComparer<T>.Default.Equals(default(T), val);

        else if (t.IsValueType)
            isDbNull = false;

        else if (t == typeof(string) && val != null)
        {
            string temp = val as String;
            isDbNull = (temp == String.Empty);
        }

        else
            isDbNull = (val == null);

        return isDbNull ? DBNull.Value : (object)val;
    }

然后你可以使用。
     Parameters.Add(new OleDbParameter("EMPID", sbcId.GetDBNullOrValue())); 

1

尝试在 DBNull.Value 后面删除 ToString()。

string sbcId = gvTest.DataKeys[gr.RowIndex]["myColumn"].ToString();
 insgnp.Parameters.Add(new OleDbParameter("EMPID", (sbcId==""?DBNull.Value:sbcId)));

那个三元运算符不起作用,但我已经解决了这个问题。谢谢Pranay。 - Zo Has

1
"

SQLString.Null应该可以很好地完成任务 :)

"

0
如果您在Access数据库中插入非字符串值,可以按以下方式编写插入查询: Insert into tableName (column1,column2) values (NULL,NULL); 但是,如果您想在Access的短文本或长文本字段中插入空值,则可以按以下方式编写插入查询: Insert into tableName (column1, column2) values('','');

-3

你的字符串就像这样

string value = "";

现在添加以下行

 if (value == ""){

  value = "NULL";
     }

现在将其插入数据库并检查是否存在空值,这是合乎逻辑的。


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