4

テーブルのデフォルトの制約として SQL Server に格納されている値を優先して、一部の値を無視する必要があるように、SQL Serverに値INSERTを格納するにはどうすればよいですか? string[]これらのデフォルトを使用するには、何を渡す必要がありますか (NULL など)。

現在、コードにすべてのデフォルトを追加していますが、かさばります。

以下は私のコードです:

if (value == "") value = "0";

string insert = "INSERT INTO " + table + " (" + columns + ") VALUES (" + atColumns + ")";

using (SqlConnection connect = new SqlConnection(connection))
{                               
    using (SqlCommand command = new SqlCommand(insert, connect))
    {
        //adds values to corresponding parameters
        for (int i = 0; i < table_cols.Length; i++)
        {
            command.Parameters.AddWithValue("@" + table_cols[i], table_vals[i]);
        }

        foreach (SqlParameter Parameter in command.Parameters)
        {
            if (Convert.ToString(Parameter.Value) == "")
            {
                Parameter.Value = DBNull.Value;
            }
        }

        connect.Open();
        command.ExecuteNonQuery();
        response = "Success";
        return response;

特定Parameter.Valueが null ではなく、SQL Server によって既定値が設定されている場合、このコードは null では機能しません。

SQL Server では、insert ステートメントで値を省略することでこれを処理します (この省略により、テーブルの既定値が挿入されますが、null を指定するとエラーが発生します)。

4

5 に答える 5

4

SQL Server で列の既定値の制約を使用する場合は、挿入パラメーターの一部として列を含めないでください。

例:

--From SQL Server
CREATE TABLE Orders
(
     Id INT IDENTITY PRIMARY KEY
    ,Amount INT NOT NULL
    ,Cost MONEY NOT NULL
    ,SaleDate DATE NOT NULL DEFAULT GETUTCDATE()
);



//From C#
public int Insert(decimal cost, int amount)
{
    using (var connection = new SqlConnection(connectionString))
    {
        var command = connection.CreateCommand();
        //Don't specify the SaleDate and it will insert the current time
        command.CommandText = "INSERT INTO Orders(Amount, Cost) VALUES(@Amount, @Cost); SELECT SCOPE_IDENTITY();";
        command.Parameters.AddWithValue("@Amount", amount);
        command.Parameters.AddWithValue("@Cost", cost);

        using(var reader = command.ExecuteReader())
        {
            if(reader.Read())
                return Convert.ToInt32(reader[0]);
        }
    }

    return 0;
}

C# コードでパラメーター リストを使用する場合は、パラメーター名をその値でグループ化したままにし、値が null で既定値がある場合はスキップします。

于 2013-02-14T20:20:59.823 に答える
2

NULL を渡すと、デフォルトをオーバーライドしてその列に NULL が必要であることを SQL に伝えます。何かを渡したい場合は、キーワード DEFAULT で渡します。使い方について記事「keyword DEFAULT」を書きました。

DEFAULT キーワードにより、(制約からの) デフォルト値が列に挿入されます。

DEFAULT を渡すときは、引用符で囲まないでください。これにより、キーワード DEFAULT ではなく文字列 DEFAULT になります。

于 2013-02-14T19:57:52.287 に答える
0

私が考えることができる他の唯一の方法は、あなたのアプローチに基づくトリガーです(そしてあなたはその時点でそれをコーディングする方が良いです)。

ただし、ストアドプロシージャを使用するようにアプローチを変更する場合は、SQLでネイティブに値の処理を行うことができます。そうしないと、アプリへのコーディングが滞ります...例としてTernaryステートメントをお勧めします:http://msdn。 microsoft.com/en-us/library/ty67wk28%28v=vs.80%29.aspx

于 2013-02-14T19:55:17.650 に答える
0

列リストに列を含めると、指定した値を挿入しようとします。NULL「デフォルト値を挿入するだけ」という意味ではありません。

その列に値を挿入したくない場合は、それを列リスト (または値リスト) に含めないでください。

テーブルの列をループして、列名や型などにとらわれないほうが効率的に見えるかもしれませんが、長い目で見れば、デフォルトを使用するかどうかを選択できるように、各列を明示的に処理するほうがよいかもしれません。値など

于 2013-02-14T19:57:07.850 に答える
0

実際にINFORMATION_SCHEMA.COLUMNSテーブルを使用して、SQL Server からすべての列の既定値を取得しました。次に、デフォルトを に整理し、string[]それをループして、null ではなくデフォルトを挿入しました (一部のデフォルトは null です)。

于 2013-02-26T18:18:40.933 に答える