相关疑难解决方法(0)

null和System.DBNull.Value有什么区别?

null和System.DBNull.Value之间有什么区别吗?如果是,那是什么?

我现在注意到了这种行为 -

while (rdr.Read())
{
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)  
    {
        int x = Convert.ToInt32(rdr["Id"]);
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我使用sql datareader从数据库中检索数据,但是没有返回if(rdr["Id"] != null)返回的值,true并最终抛出异常以将null转换为整数.

但是,如果我使用if (rdr["Id"] != System.DBNull.Value)返回false.

null和System.DBNull.Value之间有什么区别?

c# null dbnull

83
推荐指数
4
解决办法
9万
查看次数

AddWithValue参数为NULL时的异常

我有以下代码来指定SQL查询的参数.我使用时会遇到异常Code 1; 但是当我使用时工作正常Code 2.在Code 2我们检查null并因此检查if..else块.

例外:

参数化查询'(@ application_ex_id nvarchar(4000))SELECT E.application_ex_id A'需要参数'@application_ex_id',这是未提供的.

代码1:

command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
Run Code Online (Sandbox Code Playgroud)

代码2:

if (logSearch.LogID != null)
{
         command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
}
else
{
        command.Parameters.AddWithValue("@application_ex_id", DBNull.Value );
}
Run Code Online (Sandbox Code Playgroud)

  1. 你能解释一下为什么它无法从代码1中的logSearch.LogID值中获取NULL(但能够接受DBNull)吗?

  2. 有没有更好的代码来处理这个?

参考:

  1. 将null分配给SqlParameter
  2. 返回的数据类型因表中的数据而异
  3. 从数据库smallint到C#nullable int的转换错误
  4. DBNull有什么意义?

    public Collection<Log> GetLogs(LogSearch logSearch)
    {
        Collection<Log> logs = new Collection<Log>();

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            string commandText = @"SELECT  *
                FROM Application_Ex E 
                WHERE  (E.application_ex_id = @application_ex_id …
Run Code Online (Sandbox Code Playgroud)

.net c# ado.net

76
推荐指数
2
解决办法
5万
查看次数

从C#DbCommand向SQL DB插入NULL

        DbParameter param = comm.CreateParameter();
        param = comm.CreateParameter();
        param.ParameterName = "@StaffId";
        if (!string.IsNullOrEmpty(activity.StaffId))
            param.Value = activity.StaffId;
        param.DbType = DbType.String;
        comm.Parameters.Add(param);
Run Code Online (Sandbox Code Playgroud)

以上不起作用(显然),对象未实例化.我正在尝试在未填充StaffId时将NULL插入数据库.我怎样才能做到这一点?

c# sql dbcommand

17
推荐指数
2
解决办法
3万
查看次数

如何使用Dapper将字符串作为NULL发送到SQLServer?

我有一个场景,其中C#中的字符串可以null.我需要它NULL在SQLServer上.

我使用Dapper将它发送到SQLServer,查询如下:

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
    StartDate: startDate
}, commandType: CommandType.StoredProcedure);
Run Code Online (Sandbox Code Playgroud)

哪个startDate字符串有时可以等于null.

存储过程的参数是

@StartDate varchar(10) = NULL
Run Code Online (Sandbox Code Playgroud)

当它是时NULL它返回所有记录.我已经确认这种行为可以通过SSMS实现.

我读过Marc Gravell的这篇文章指出:

null vs DBNull问题是一个混乱的常见原因; 但是,通常如果人们null在C#中说他们打算null使用SQL.这是小巧玲珑采用的方法.

这让我相信当string设置为时null,它应该发送DBNull.Value到SQLServer.

但是,情况似乎并非如此.我在发送null字符串时从SQLServer返回0条记录.这似乎表明发送一个空字符串,而不是一个DBNull.Value.

另外,我不能DBNull.Value直接发送:

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
    StartDate: DBNull.Value
}, commandType: CommandType.StoredProcedure);
Run Code Online (Sandbox Code Playgroud)

这会在Dapper中产生异常:

System.DBNull类型的成员StartDate不能用作参数值

NULL当我string在C#中可以使用Dapper时,如何使用Dapper 发送到SQLServer null


重要

Dapper确实NULL在字符串发送时发送null.基于错误的信息,这个假设是我的错误.尽管如此,这个问题可能有助于帮助那些做出同样错误假设的其他人. …

c# sql-server dapper

13
推荐指数
2
解决办法
6275
查看次数

为什么DBNull.Value需要正确的SqlDbType?

我编写了一堆通用的C#辅助函数作为我的SQL查询的基础.所有null对象参数都转换为a DBNull.Value.但是当目标列是a时varbinary,它告诉我该string类型与该类型不兼容,binary我必须转换.

为什么我需要SqlDbType一个DBNull.Value在C#中?有没有通用的方法来解决这个问题?

// works for nvarchar but throws for varbinary columns
// notice the lack of SqlDbType as I don't know it for a null object
var param1 = new SqlParameter();
param1.Name = "@Param1";
param1.Value = DBNull.Value;
Run Code Online (Sandbox Code Playgroud)

它是一个空的...它不需要任何类型.SQL服务器知道null的类型.在SQL你说[Column] IS NULL不是[Column] IS TYPE NULL.所以null是无类型的.并且目标列是从查询解析而不是SqlDbType.

我发现这非常不直观(显式输入空值).我想知道我是否遗漏了一些东西......

代码是这样的:

SqlCommand CreateCommand(string query, params object[] arguments) { ... }
// in here …
Run Code Online (Sandbox Code Playgroud)

c# sql-server

4
推荐指数
1
解决办法
928
查看次数

当字符串为空时,将NULL插入SQL

尝试在我的组合框中没有选择任何内容时插入NULL但是当我这样做时:

prikaz.Parameters.AddWithValue("@odjezd", cb_odjezd.Text == string.Empty ?
                                               null : cb_odjezd.Text);
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

参数化查询需要参数@ odjezd

愿有人帮我解决这个问题吗?

c# sql sql-server winforms

3
推荐指数
1
解决办法
7461
查看次数

无论如何,DBNull需要什么?

可能重复:
DBNull有什么意义?

自从我开始使用.NET以来,我总是问自己一个问题:

为什么我们需要DBNull类型?简单的null引用是不够的?

MSDN说DBNull"表示不存在的值".从逻辑的角度来看 - 这一句话解释了为什么不能使用空引用 - 因为它是一个空引用而不是缺少值.但引入一种导致很多麻烦的类型是否足够?

顺便说一句:如果有人在辩护方面有话要说,DBNull我会非常感激.

c# dbnull

2
推荐指数
1
解决办法
541
查看次数

如果前一个param为null,则参数没有默认值?

除非我尝试在参数中传递空值,否则我有这个查询似乎有效:

using (OleDbCommand com = new OleDbCommand("INSERT INTO [GROUP] ([Group Number], [Group Name], [Address 1], " +
                        " [Address 2], [City State Zip], [Phone], [Carrier Code], [Retail Plan Num 1], [Retail Plan Num 2], " +
                        " [Retail Plan Num 3], [Retail Plan Num 4], [Retail Plan Num 5], [Plan Start Date 1], [Plan Start Date 2], " +
                        " [Plan Start Date 3], [Plan Start Date 4], [Plan Start Date 5]" +
                        ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", con))
                    {
                        com.Parameters.Add("@p0", OleDbType.Char, …
Run Code Online (Sandbox Code Playgroud)

c# ado.net

2
推荐指数
1
解决办法
3162
查看次数

添加更多参数然后在查询中使用?

有没有办法在我的SqlCommand中添加一个参数,如果在我的查询中没有使用它,引擎就不会抱怨?

我有大约50个参数要包含在我的查询中,但需要包含哪些参数在很大程度上取决于具体情况.我可以轻松地删除200行代码,如果我可以将它们全部置于顶部并在添加我的参数后构建我的查询.

一个非常简单/愚蠢/错误的例子(是的,这里的解决方案是在else子句中添加id)

cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
cmd.Parameters.Add("@name", SqlDbType.nVarChar, 250).Value = name;

if(id == null) cmd.CommandText = "INSERT INTO tab (name) VALUES (@name)";
else cmd.CommandText = "UPDATE tab SET name = @name WHERE id = @id";
Run Code Online (Sandbox Code Playgroud)

这会返回错误:

System.Data.SqlClient.SqlException:参数化查询'(@ id,@ name)'需要参数'@id',这是未提供的

如果不可能,简单的"否"就足以被接受为答案.

c# sql

2
推荐指数
1
解决办法
112
查看次数

为什么 dataTable.Rows[0]["columnName"] == null。不工作?

我有一个像下面这样的代码

txtbox1.Text = dtDetails.Rows[0]["columnName"] == null ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();
Run Code Online (Sandbox Code Playgroud)

上面一行是始终not null即使dtDetails.Rows[0]["columnName"] is null

txtbox1.Text = dtDetails.Rows[0]["columnName"] == DBNull.Value ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();
Run Code Online (Sandbox Code Playgroud)

完美地工作。这是为什么?以及如何null不同DBNull.Value

c# asp.net dbnull

2
推荐指数
1
解决办法
2006
查看次数

在参数化SQL查询中允许Null值?

我有以下SQL查询,根据参数将记录插入数据库.它运行良好但不允许空值,如果有空则返回错误.

该表设置为允许Null.

SqlConnection dbconnection = new SqlConnection(@"Data Source=LEWIS;Initial Catalog=CustomPC;Integrated Security=True");


SqlCommand InsertPC = new SqlCommand("INSERT INTO [Custom_PC] ([CPU_ID], [Motherboard_ID],[Graphics_Card_ID],[PSU_ID],[RAM_ID],[Case_ID],[Primary_Storage_Drive_ID],[Secondary_Storage_Drive_ID],[Primary_Optical_Drive_ID],[Secondary_Optical_Drive_ID]) VALUES (@CPU_ID, @Motherboard_ID, @Graphics_Card_ID, @PSU_ID, @RAM_ID, @Case_ID, @Primary_Storage_Drive_ID, @Secondary_Storage_Drive_ID, @Primary_Optical_Drive_ID, @Secondary_Optical_Drive_ID) SET @ReturnedID = Scope_Identity();", dbconnection);

SqlParameter CPU_IDParam = InsertPC.Parameters.Add("@CPU_ID", SqlDbType.Int);
CPU_IDParam.Value = Session["DATA"];

SqlParameter Motherboard_IDParam = InsertPC.Parameters.Add("@Motherboard_ID", SqlDbType.Int);
Motherboard_IDParam.Value = Session["MotherboardID"];

SqlParameter Graphics_Card_IDParam = InsertPC.Parameters.Add("@Graphics_Card_ID", SqlDbType.Int);
Graphics_Card_IDParam.Value = Session["GraphicsID"];

SqlParameter PSU_IDParam = InsertPC.Parameters.Add("@PSU_ID", SqlDbType.Int);
PSU_IDParam.Value = Session["PSUID"];

SqlParameter RAM_IDParam = InsertPC.Parameters.Add("@RAM_ID", SqlDbType.Int);
RAM_IDParam.Value = Session["RAMID"];

SqlParameter Case_IDParam = InsertPC.Parameters.Add("@Case_ID", SqlDbType.Int); …
Run Code Online (Sandbox Code Playgroud)

c# sql sql-server

1
推荐指数
1
解决办法
950
查看次数

是否可以从故障点继续运行代码?

好的,我有一些非常简单的代码,我将在下面发布.本质上,我有一个与数据库的连接,我想将查询中的列子集映射到特定的类.问题是这些可能为空.

我想知道是否有可能在特定行抛出异常,我们可以从下一行恢复整个块.

因此,如果以下代码执行,第6行捕获错误.是否有一种优雅的方法来捕获异常并使代码恢复在第7行继续运行.本质上使它就像第6行从未执行过一样.

 private static Column MapTableToColumn(OracleDataReader reader){
        Column c = new Column();
        c.ColumnName = Convert.ToString(reader["COLUMN_NAME"]);
        c.DataType = Convert.ToString(reader["DATA_TYPE"]);
        c.DataLength = Convert.ToInt32(reader["DATA_LENGTH"]);
        c.DataPrecision  = Convert.ToInt32(reader["Data_Precision"]);//<---Line 6
        c.DataScale = Convert.ToInt32(reader["Data_scale"]);//<--- Line 7
        c.AllowDBNull = Convert.ToBoolean(reader["ALLOW_DB_NULL"]);
        c.IsReadOnly = Convert.ToBoolean(reader["IS_READ_ONLY"]);
        c.IsLong = Convert.ToBoolean(reader["IS_LONG"]);
        c.IsKey = Convert.ToBoolean(reader["IS_KEY"]);
        c.KeyType = Convert.ToString(reader["KEY_TYPE"]);
        c.IsUnique = Convert.ToBoolean(reader["IS_UNIQUE"]);
        c.Description = Convert.ToString(reader["DESCRIPTION"]);
        return c;
    }
Run Code Online (Sandbox Code Playgroud)

重要的是要注意我不是要求最佳实践,这不是我打算在实际代码中使用的东西(除非它绝对天才).我只是想知道这是否可行以及如果有的话会怎么做.

我的研究

我的大多数研究都是主动的而不是反应性的.我会尝试知道给定字段在读取之前是否可能为null.如果是,那么我会检查以确定该字段是否为空,然后将其设置为默认值.它基本上避免了发生错误的可能性,我认为这是一个非常好的解决方案.我只想尝试这个,因为我知道当抛出异常时,最内部的异常包含抛出它的行号.基于此,如果您将异常置于抛出异常的类中,您应该假设能够使用反射以便从最后一点继续运行.我只是不确定你是怎么做的.我还考虑过可能会在每一行都设置尝试,我认为这会非常有效; 但是,我认为它会非常难看.

.net c# database oracle exception-handling

1
推荐指数
2
解决办法
430
查看次数