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();

}

すべてのフィールドでこの数百回を書き出すのではなく、これを行うためのより適切で短い方法があるかどうかを知りたかっただけですか?

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

4 に答える 4

4

もちろん; それは実際にはdapperにぴったりです

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

基本的に、dapper は (単一の) パラメータ オブジェクトをキーと値のストアとして扱います。 コマンド内にあるため、 vsを含む using ルールを使用して を@commRate追加します ( andについても同様です)。record.commRatenullDBNullrecord.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 サーバーの一括コピーを使用してみてください。

例:

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 に答える