0

したがって、これが可能かどうか、または推奨されるかどうかはわかりませんが、ユーザーが動的に構築できる Web サービスで更新コマンドを作成する方法を見つけようとしていました。基本的に、目標は、x 個の列を持つテーブルがあり、更新されていない列に null または既存の値を渡すことなく、ユーザーが任意の数の列を更新できるようにすることです。たとえば、ある人が走りたいと思うかもしれません

UPDATE calendar_table
SET title = 'Some new Title'
WHERE (id = 12344)

そして、別のユーザーが代わりにこのアクションを実行したい場合があります

UPDATE calendar_table
SET title = 'New Event', type = 'Meeting', note = 'Meet with new client'
WHERE (id = 12344)

以下は私が使用しようとしていたものですが、「WHERE」の近くに問題があるという例外が発生し続けているため、更新文字列を処理しようとしている方法に何かがあると信じています。

String MyConnStr = ConfigurationManager.ConnectionStrings["MainConnStr"].ConnectionString;
        SqlConnection connection = new SqlConnection(MyConnStr);
        SqlCommand Query = new SqlCommand("UPDATE dbo.calendar_table " +
            "SET @newText " +
            "WHERE (id = @appointmentID)", connection);
        Query.Parameters.Add("@newText", SqlDbType.VarChar).Value = note;
        Query.Parameters.Add("@appointmentID", SqlDbType.VarChar).Value = appointment;
        Query.CommandType = CommandType.Text;
        try
        {
            connection.Open();
            Query.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
        finally
        {
            connection.Close();
            Query.Dispose();
        }

私が考えることができる唯一の他のオプションは、可能なすべての値を使用してWebサービスを作成し、値とともに変更されていない既存の値を渡すことです。

4

1 に答える 1

0

コードは、特定の更新に対してどのフィールドが設定されるかを認識していると想定されます。SETしたがって、各フィールドを句とParametersコレクションに動的に追加できます。各フィールドにパラメーターを使用すると、コメントで言及されている SQL インジェクションの問題も回避されます。

サンプル コードの構文に基づいて、C# であると想定しています。以下は、変数のユーザー定義数のフィールドの更新を処理する方法の 1 つです。

ユーザーが入力した値を含む変数があると仮定します: userInputTitleuserInputTypeuserInputNoteなど。

節に動的に追加される各フィールドの前にカンマを追加するかどうかという問題を取り除くために、フィールドが節に含まidれています。これの副作用として、ユーザーがフィールドを定義していなくても更新を実行できます。SETSET

ところで、インターフェイスusingを実装するオブジェクトを明示的にクリーンアップしようとする代わりに、使用する方が良いと考えられてIDisposableいるため、以下の例はそれに応じて書き直されています。using ステートメントは接続を閉じ、接続とコマンドを破棄します。また、 を使用Parameters.AddWithValue()すると、パラメーターのデータ型を指定する必要がなくなります。

このコードはテストしていません。

String MyConnStr =
        ConfigurationManager.ConnectionStrings["MainConnStr"].ConnectionString;
using (SqlConnection connection = new SqlConnection(MyConnStr))
{
    using (SqlCommand Query = new SqlCommand())
    {
        try
        {
            Query.Connection = connection;
            String sql = "UPDATE dbo.calendar_table SET id = @appointmentID";
            // The has-field-been-updated-by-user logic below assumes the
            // fields are strings.  Different logic might be necessary
            // for other data types.
            if (!String.IsNullOrWhitespace(userInputTitle))
            {
                sql += ", title = @title";
                Query.Parameters.AddWithValue("@title", userInputTitle);
            }
            if (!String.IsNullOrWhitespace(userInputType))
            {
                sql += ", type = @type";
                Query.Parameters.AddWithValue("@type", userInputType);
            }
            if (!String.IsNullOrWhitespace(userInputNote))
            {
                sql += ", note = @note";
                Query.Parameters.AddWithValue("@note", userInputNote);
            }
            // Additional fields...
            sql += " WHERE (id = @appointmentID)";
            Query.Parameters.AddWithValue("@appointmentID", appointmentID);
            Query.CommandText = sql;
            Query.CommandType = CommandType.Text;
            connection.Open();
            Query.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
    }
}
于 2013-02-22T05:19:36.787 に答える