繁体   English   中英

C#DBNull.Value插入0

[英]C# DBNull.Value Inserting 0

我正在尝试将数据插入SQL表中。 我遇到的数据类型是可空的浮点数。 插入NULL值后,它们将变为0。如何保持NULL。

private void InsertStatisticsData(DataTable dt)
{
    //check isin periodicity and As of Date
    foreach(DataRow row in dt.Rows)
    {
        DataTable queryResultTable = SQL.Query($@"SELECT * FROM Statistics
                                                WHERE [CodeID] = '{row["CodeID"]}' 
                                                AND [Periodicity] = '{row["Periodicity"]}'
                                                AND [As of Date] = '{row["As of Date"]}'");

        if(queryResultTable.Rows.Count == 0)
        {
            //Check for Null Values 
            for(int i = 0; i < row.ItemArray.Count(); i++)
            {
                if (Convert.ToString(row[i]) == "")                        
                    row[i] = (object)DBNull.Value;                        
            }
            //Insert Data Into DataBase
            SQL.NonQuery($@"INSERT INTO Statistics
                        VALUES ('{row["CodeID"]}' ,
                                '{row["Volatility"]}',
                                '{row["Beta"]}',
                                '{row["Info Ratio"]}',
                                '{row["Tracking"]}',
                                '{row["Drawdown"]}',
                                '{row["Periodicity"]}',
                                '{row["As of Date"]}')");
        }
    }
}

非查询功能:

public static void NonQuery(string query, string databaseName = "Database", string serverAddress = "server-name", int commandTimeout = 30)
{
    string connString = $"Server = {serverAddress}; Database = {databaseName}; Trusted_Connection = True";
    using (SqlConnection sqlConn = new SqlConnection(connString))
    using (SqlCommand cmd = new SqlCommand(query, sqlConn))
    {
        sqlConn.Open();
        cmd.CommandTimeout = commandTimeout;
        cmd.ExecuteNonQuery();
    }
}

您需要确保您的数据库列结构在实际需要的地方包含NULL类型。 还要确保没有设置任何默认约束,当分配null值时,默认约束将自动将列的值设置为0

if(Convert.ToString(null) == "")

将被评估为假。

所以下面的代码将不会执行

row[i] = (object)DBNull.Value; 

附带说明,您应该使用SqlParameters而不是在字符串中附加值。

这似乎有点笨拙和肿,但是如果您使用参数(并且确实应该使用),那么我在我的项目中使用了一种扩展方法来获取任何命令对象并遍历参数以将.NET空到DbNull:

private static void ProcessNullParameters(this DbCommand command)
{
    foreach (DbParameter param in command.Parameters)
    {
        if (param.Value == null)
            param.Value = DBNull.Value;
    }
}

这样,如果您的本机对象返回空值,则可以针对命令对象调用扩展方法。 我无法确定您的示例中的SQL对象是什么(某种类型的框架?),但是大概在幕后某个地方会发生这种情况:

SqlCommand cmd = new SqlCommand("insert into Statistics values (@Code, @Volatility)", conn);
cmd.Parameters.Add("@Code", SqlDbType.VarChar);
cmd.Parameters.Add("@Volatility", SqlDbType.Decimal);

foreach (DataRow dr in dt.Rows)
{
    cmd.Parameters[0].Value = dr["Code"];
    cmd.Parameters[1].Value = dr["Volatility"];

    // And here you convert your nulls to DbNull
    cmd.ProcessNullParameters();

    cmd.ExecuteNonQuery();
}

替代方法是对每个可为空的值声明执行此操作。

cmd.Parameters[0].Value = dr["Code"] ?? DbNull.Value
cmd.Parameters[1].Value = dr["Volatility"] ?? DbNull.Value;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM