1

我有很多字段需要传输到 SQL Server 数据库表,但我遇到了一些NULL值问题。

我可以使用类似于

using (SqlConnection conn = new SqlConnection(connectionString))
 {

  SqlCommand cmd_insert = new SqlCommand("INSERT INTO AccStats (Field1 , Field2 ,
     Field3) VALUES (@value1 , @value2 , @value3)", conn);

  if (record.commRate == null)
  {
    cmd_insert.Parameters.AddWithValue("@value1", DBNull.Value);
  }
  else
  {
    cmd_insert.Parameters.AddWithValue("@value1", record.commRate);
  }

  //Lots more fields

  conn.Open();
  cmd_insert.ExecuteNonQuery();
  conn.Close();

}

我只是想知道是否有一种更简洁/更短的方法来做到这一点,而不是为所有领域写出这 100 次?

  if (record.commRate == null)
  {
        cmd_insert.Parameters.AddWithValue("@value1", DBNull.Value);
  }
  else
  {
        cmd_insert.Parameters.AddWithValue("@value1", record.commRate);
  }
4

4 回答 4

4

当然; 这实际上非常适合小巧玲珑

conn.Execute(
    "INSERT INTO AccStats (Field1,Field2,Field3) VALUES (@commRate,@anotherField,@yetAnotherField)", 
   record);

基本上,dapper 将(单个)参数对象视为键值存储 - 因为@commRate在命令中,它使用包括vsrecord.commRate在内的使用规则添加(以及同样的 for and )。nullDBNullrecord.anotherFieldrecord.yetAnotherField

于 2012-12-12T14:55:34.370 回答
2

编写一个将返回DBNull.Value或实际值的函数:

private object DBNullOrValue<T>(T val) where T : class
{
   if(val == null)
     return DBNull.Value;

   return val;
}
于 2012-12-12T14:54:56.547 回答
1

选择你最喜欢的:

1)

cmd_insert.Parameters.AddWithValue("@value1", record.commRate ?? DBNull.Value);

2)

public static object NullToDBNull(this object val) 
{
   return val ?? DBNull.Value;
}

cmd_insert.Parameters.AddWithValue("@value1", record.commRate.NullToDBNull());

3)

public static void AddNullable(this SqlParameterCollection parameters, 
                            string paramName, object newParameter)
{
    parameters.AddWithValue(paramName, newParameter ?? DBNull.Value);
}

cmd_insert.Parameters.AddNullable("@value1", record.commRate);
于 2012-12-12T15:03:09.297 回答
0

尝试使用 Sql server 批量复制。

例子:

string connectionString = GetConnectionString();
        using (var connection = new SqlConnection(connectionString))
        {
            using (connection)
            {
                connection.Open();
                // Create a table with some rows. 
                using (var newSessionResults = MakeTable(results))
                {
                    using (var bulkCopy = new SqlBulkCopy(connection))
                    {
                        bulkCopy.DestinationTableName = "tablename";

                        try
                        {
                            // Write from the source to the destination.
                            bulkCopy.WriteToServer(newSessionResults);
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine(ex.Message);
                            throw;
                        }
                    }
                }
            }
        }
于 2012-12-12T15:26:23.347 回答