2011-11-14 10 views
0

VB.netを使用してパラメータ化されたクエリからSSEE 2008 R2に渡される値をNullで保存する必要があります。NULL値をパラメータとして渡してSql dbを更新します。

値は 'Null'または空の文字列 ""のいずれかです。これをテストし、私のストアドプロシージャのフィールドを正しく更新するにはどうすればよいですか?

EDIT:宣言が追加されました。

@ID int,  
@currTable varchar(150), 
@prev_LangString nvarchar(max), 
@brief_Descrip nvarchar(max) 

BEGIN 
IF @brief_Descrip IS NULL OR @brief_Descrip = 'Null' 
SET @brief_Descrip = 'Null'; 
END 

BEGIN 
SET @sql = 'UPDATE ' + @currTable + ' SET [date_Changed] = ''' + convert(varchar(20), @submitDate1) + ''', [prev_LangString] = ''' + @prev_LangString + ''', [brief_Descrip] = ''' + @brief_Descrip + ''' 
     WHERE (ID = ' + CAST(@ID as nvarchar(10)) + '); ' 

     EXECUTE(@sql); 
END 

ありがとうございました。

+2

http://en.wikipedia.org/wiki/SQL_injection – Oded

+0

And:http://www.sommarskog.se/dynamic_sql.html – Oded

答えて

2

問題は@brief_Descriptを文字列に変換することです。これにより、あなたの注射の脆弱性も修正されます。

BEGIN 
IF @brief_Descrip = 'Null' 
SET @brief_Descrip = NULL; 
END 

UPDATE TABLE table_name 
SET 
    date_Changed = convert(varchar(20), @submitDate1), 
    prev_LangString = @prev_LangString, 
    brief_Descrip = @brief_Descrip, 
WHERE 
    ID = CAST(@ID as nvarchar(10)) 

EDIT

この問題を解決する最良の方法は、vb.netではDBNullにヌル文字列を変換し、更新文でパラメータ化クエリを使用することです。 日付を文字列に変換しないでください。列の種類を日付時刻に変更します。

+0

テーブル名は変数です。あなたが書いたようにテーブル名を使用しようとするときに、テーブル名が変数であるときに実行するコードの取得に問題がありました。私は常に注射についても心配していますが、この例ではインターフェースは公開されておらず、従業員に限られています。 "@brief_Descrip"は文字列フィールドであり、正確にはnvarcharです。私は宣言を編集して追加します。日付フィールドもチェックします。ありがとう、 – htm11h

+0

修正、@ currTableは変数です。 – htm11h

+0

@ march11h、私はそれが変数であることを知っていますが、そうではありません。確かに、テーブル名をサニタイズするのは難しくありませんが、あなたはまだ動的SQLを使用しています。どのくらいあなたのユーザーを信頼しても、セキュリティ上の脆弱性を持つコードを書くのはひどい考えです。達成しようとしていることは何でも、それについてもっと良い方法があります。私は、SQLを呼び出すコードを見ずに、より具体的な助言を与えることはできません。 – mikerobi

0

もう1つのオプションは、パラメータ化されたクエリを使用することです。それはあなたの問題を遠ざけることさえします。このように:

DECLARE @sql NVARCHAR(4000), @params NVARCHAR(4000) 
SET @sql = 'UPDATE ' + @currTable + ' SET date_changed = @p0, prev_langstring = @p1, brief_descrip = @p2 WHERE id = @p3' 
SET @params = '@p0 VARCHAR(20), @p1 VARCHAR(???), @p2 VARCHAR(???), @p3 NVARCHAR(10)' 

DECLARE @sd VARCHAR(20), @sid NVARCHAR(10) 
SET @sd = CONVERT(VARCHAR(20), @submiteDate1) 
SET @sid = CAST(@ID AS NVARCHAR(10)) 
EXEC sp_executesql @sql, @params, @p0 = @sd, @p1 = @prev_langstring, @p2 = @brief_descrip, @p3 = @sid 

私は、したがって、あなたが上記を参照VARCHAR(???)@prev_langstringのと@brief_descripのデータ型を知りません。それを実際のデータ型に置き換えます。 sp_executesqlhereについて読むことができます。

関連する問題