100个字段有更短的选择吗?

时间:2012-12-12 14:51:54

标签: c# sql

我有很多字段需要传输到SQL服务器数据库表,我在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 个答案:

答案 0 :(得分:4)

不确定;这实际上非常适合dapper

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

基本上,dapper将(单个)参数对象视为键值存储 - 因为@commRate在命令中,它使用包含record.commRate vs的使用规则添加null DBNull(同样适用于record.anotherFieldrecord.yetAnotherField)。

答案 1 :(得分:2)

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

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

   return val;
}

答案 2 :(得分: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);

答案 3 :(得分: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;
                        }
                    }
                }
            }
        }