2

私の C# プロジェクトでは、いくつかの null 値を UniqueIdentifier 列に挿入する必要があります。

フィールド都市 Guid、州 Guid フィールドの場合、使用可能な値 (一意の識別子) がない場合は、null 値を挿入できるはずです。次のエラーが表示されます

「文字列からuniqueidentifierへの変換で変換に失敗しました。」

これが私のコードです。

   string Query = @"INSERT INTO mytable
                            (table_GUID,
                            Date,
                            city_GUID,
                            state_GUID,                            
                            ) 

                        VALUES
                        ('" + tableGUID + @"', 
                        '" + Date + @"',  
                        '" + cityGUID + @"',
                        '" + stateGUID + @"'
                    )                       

 string insert = sql.executeNonQuery(Query);
4

3 に答える 3

8

このような値を指定しないでください。SqlCommand を作成し、値をパラメーターとして指定します。null 値を挿入するには、次を使用します。DBNull.Value

    var command = new SqlCommand(
        @"INSERT INTO mytable (table_GUID, Date, city_GUID, state_GUID)                      
          VALUES (@TableGuid, @Date, @CityGuid, @StateGuid)", sqlConnection);
    command.Parameters.AddWithValue("TableGuid", tableGUID ?? DBNull.Value);
    command.Parameters.AddWithValue("Date", Date);
    command.Parameters.AddWithValue("CityGuid", cityGUID ?? DBNull.Value);
    command.Parameters.AddWithValue("StateGuid", stateGUID ?? DBNull.Value);
    command.ExecuteNonQuery();

これを行う別の方法は、値として NULL を指定することです。null値をSQLサーバーに挿入する方法を参照してください

ヘルパー関数を定義して、引用符で囲まれた値または NULL 文字列を返すこともできます。

private string GetQuotedParameterThing(Guid? value)
{
    return value == null ? "NULL" : "\"+ value + \"";
}

次にGetQuotedParameterThing(tableGUID)、コマンド文字列に指定するだけです。

于 2013-06-07T21:17:52.663 に答える
1

ADO.NET パラメータを使用してこれを行う方法を示す回答が既に存在します。これは、この問題に対する完全に正しい回答です。生の TSQL を使用する必要がある場合は、null 値と非 null 値を区別する必要があります。null 以外の値には引用符が必要ですが、null 値はnull引用符なしで送信する必要があります。nullは完全に有効な null 許容の uniqueidentifier ですが、'null' そうではありません

ただし、あなたの例では、sql.executeNonQueryメソッドを変更してparameters を受け入れることが本当のトリックだと思います。そうでない場合は、現在のシステムが根本的に壊れていることを保証します。たった今。危険です。問題。リスキーな。

しかし、これは簡単に修正できます。あなたの場合、とてつもなく簡単です。たとえば、これは次のようになります。

const string Query = @"
INSERT INTO mytable (table_GUID, Date, city_GUID, state_GUID) 
VALUES (@tableGUID, @Date, @cityGUID, @stateGUID)";

string insert = sql.executeNonQuery(
    Query, new { tableGUID, Date, cityGUID, stateGUID });
              ^^^ hot damn! who knew parameterization could be that easy!?

既存のexecuteNonQueryメソッドを次のようにするだけの場合:

void executeNonQuery(string query, object args = null) {
    //... not shown: your code that gets a connection
    connection.Execute(query, args);
    //... not shown: your code that cleans up
}

dapperへの参照を追加するだけです。簡単に言えば、dapper は正しいパラメータ化を簡単にします。上記の変更は、将来的にパラメータ化できるようにすることを除いて、既存のコードに影響を与えることなく行うことができます。

于 2013-06-07T22:41:27.350 に答える
0

問題は、コードが「空の文字列」を通過させたことにあると思います。おそらく、string.Empty を確認してから、代わりに Guid.Empty または NULL を渡すことができます。

于 2014-08-13T20:19:20.607 に答える