2

私の現在の最良のコードは次のとおりです。

string delNonQuery = "DELETE FROM " + Settings.DataSource + " WHERE @keycolumn=@keyuid";

SqlCommand cmd = new SqlCommand(delNonQuery,readerConn);
SqlParameter kc = new SqlParameter("keycolumn", SqlDbType.VarChar);
SqlParameter key = new SqlParameter("keyuid", SqlDbType.VarChar);
cmd.Parameters.Add(kc).Value = Settings.KeyColumn;
cmd.Parameters.Add(key).Value = Page.Request["key"].ToString().Trim();

readerConn.Open();
cmd.ExecuteScalar();
readerConn.Close();

これは実行されますが、なんとゼロ行に影響します。keyuidのSqlDbTypeをUniqueIdentifierに変更すると、「文字列をuniqueidentifierに変換できませんでした」というバリエーションが12個表示されてしまいます。私はデータのクリーンさのためにパラメータ化されたクエリを使用する必要があります、私はどのように本当に立ち往生しています...

4

3 に答える 3

2

列名のパラメーターを指定することはできません。テーブル名の場合と同じ方法でパラメーターを連結する必要があります。

これ:

"DELETE FROM " + Settings.DataSource + " WHERE @keycolumn=@keyuid"

次のように変更する必要があります。

"DELETE FROM " + Settings.DataSource + " WHERE " + Settings.KeyColumn + " =@keyuid"

私はおそらくそれを次のように書くでしょうが:

string delNonQuery = string.Format("DELETE FROM {0} WHERE {1} = @keyuid", 
                                   Settings.DataSource, 
                                   Settings.KeyColumn);

完全を期すために、これはSQLインジェクションに対してオープンであることに言及します。Settingsあなたはあなたの価値観がきれいであることを確認する必要があります。

于 2011-08-02T15:30:52.843 に答える
2

列名( "keycolumn")をパラメーター化できるとは思いません

これを試して:

string delNonQuery = string.Format("DELETE FROM " + Settings.DataSource + " WHERE {0}=@keyuid", Settings.KeyColumn);

SqlCommand cmd = new SqlCommand(delNonQuery,readerConn);
SqlParameter key = new SqlParameter("keyuid", SqlDbType.VarChar);
cmd.Parameters.Add(key).Value = Page.Request["key"].ToString().Trim();

readerConn.Open();
cmd.ExecuteScalar();
readerConn.Close();

SQLを構築するための文字列の連結に関しては、通常の警告が適用されます。これはおそらくセキュリティリスクです。

最良の方法は、SQLをストアドプロシージャにカプセル化し、列の名前と値をパラメータとして渡してから、動的SQLを使用して実行することです。

于 2011-08-02T15:32:10.497 に答える
0

文字列を GUID に変換する必要があります。

関連する行:

SqlParameter key = new SqlParameter("keyuid", SqlDbType.UniqueIdentifier);
...
cmd.Parameters.Add(key).Value = new Guid(Page.Request["key"].ToString().Trim());

GUID/UniqueIdentifer の問題のみを解決するもの

于 2011-08-02T15:30:10.010 に答える