0

問題が何であるかはわかりませんが、私のコードは次のようになります。

function() {
string sqltext2;
sqltext2 = "INSERT into myTable";
SqlCommand myCommand2 = new SqlCommand(sqltext2, MyConnection2);

if (cond1) {

    sqltext2 = sqltext2 + "SELECT" + "@initOwnerFirstName" + "," + "@ownerFirstName"  + "UNION ALL ";
    SqlParameter param = new SqlParameter();
    param.ParameterName = "@initOwnerFirstName";
    param.Value = initOwnerFirstName;
    SqlParameter param2 = new SqlParameter();
    param2.ParameterName = "@ownerFirstName";
    param2.Value = owner.FirstName;
    myCommand2.Parameters.Add(param);
    myCommand2.Parameters.Add(param2);

私はパラメーター化された SQL をまったく使用していませんが、構文は私には正しいようです。私が取得し続けるエラーは次のとおりです。

スカラー変数「@initOwnerFirstName」を宣言する必要があります。私がそのようなステートメントを書いている理由は、SQLtext に追加する他の複数の if ステートメントを用意するつもりだからです。

編集: 私の構文は他の変数なしではほとんど意味がないため、if ステートメントの後のコード全体を次に示します。これは JYelton が提案した後にクリーンアップされましたが、それでも同じエラーが発生します。

sqltext2 = sqltext2 + "SELECT" + "'" + currentUserId2 + "'," + "'" +  owner.Id.ToString() + "'," + "'" + DateTime.Now + "'," + "'FirstName', @initOwnerFirstName, @ownerFirstName UNION ALL ";
myCommand2.Parameters.AddWithValue("initOwnerFirstName", initOwner.FirstName);
myCommand2.Parameters.AddWithValue("OwnerFirstName", owner.FirstName);
4

2 に答える 2

2

パラメータ化されたクエリの仕組みは次のとおりです。

using (SqlConnection conn = new SqlConnection("connectionstring"))
{
    using SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = @"INSERT INTO mytable
            (initOwnerFirstName, ownerFirstName)
            VALUES (@initOwnerFirstName, @ownerFirstName);";
        cmd.Parameters.AddWithValue("initOwnerFirstName", initOwner.FirstName);
        cmd.Parameters.AddWithValue("ownerFirstName", owner.FirstName);
        // ... execute query
    }
}

myTableステートメントの結果に挿入しているように見えSELECTますが、列名が入る場所にパラメーターを渡そうとしています。パラメーターは値に置き換え@variablenameます。したがって、パラメーターは値用であり、列名用ではありません。

複数の値の場合は、括弧を使用してセットを指定し、コンマで区切ります。

INSERT INTO mytable (col1, col2) VALUES ("a", "b"), ("c", "d"), ("e", "f");

この構文に適合するように、クエリ文字列を適切に変更できます。

詳細: SQL 挿入構文

于 2011-06-24T18:50:17.893 に答える
2

問題は、スペースなしで文字列を連結している可能性があります。連結する必要もありません。以下の私の更新を参照してください。

function() {
string sqltext2;
sqltext2 = "INSERT into dbo.OwnerChanges ";
SqlCommand myCommand2 = new SqlCommand(sqltext2, MyConnection2);

if (cond1) {
    //no concatenating
    sqltext2 = sqltext2 + " SELECT @initOwnerFirstName , @ownerFirstName UNION ALL ";
    SqlParameter param = new SqlParameter();
    param.ParameterName = "@initOwnerFirstName";
    param.Value = initOwnerFirstName;
    SqlParameter param2 = new SqlParameter();
    param2.ParameterName = "@ownerFirstName";
    param2.Value = owner.FirstName;
    myCommand2.Parameters.Add(param);
    myCommand2.Parameters.Add(param2);

あなたのコードの残りの部分が何をしているのかはわかりませんがUNION ALL、すべての最後に末尾を残しているのではないかと思います。各サブクエリを配列に入れてString.Joinを使用するだけで、おそらくメリットが得られます。

アップデート:

私は問題を見ていると思います。元の文字列ではなく CommandText を更新する必要があります。したがって、これを変更します。

sqltext2 = sqltext2 + " SELECT @initOwnerFirstName , @ownerFirstName UNION ALL ";

これに:

myCommand2.CommandText= sqltext2 + " SELECT @initOwnerFirstName , @ownerFirstName UNION ALL ";

于 2011-06-24T18:39:14.907 に答える