0

Web ページ内に、いくつかの値を SQL サーバーの列に挿入するためのボタンがあります。これらの値の 1 つはたまたまデータ型 Date です。以下は、私の asp.net ページのコードです。

 protected void Button1_Click(object sender, EventArgs e)
{
     con.Open();
     SqlCommand cmd1 = new SqlCommand("insert into dbo.FillTable values ('TextBox2.Text', 'TextBox1.Text', 'FA0005')",con);
     SqlDataAdapter dr = new SqlDataAdapter(cmd1);
     con.Close();
     DataSet dl = new DataSet();
     dr.Fill(dl);
     //Label5.Text = dl.Tables[0].Rows[1][9].ToString();

}

ユーザーが日付を形式 (yyyy-MM-dd) で入力できるようにしたいと考えています。これは、SQL サーバーの日付形式です。「TextBox2」は、日付入力を保持するテキストボックスです。ex.のように日付をハードコードするだけです。「2010-01-01」、「50」、「FA0005」、うまく機能してレコードを挿入します。ただし、コーディングすると、「TextBox2.Text」、「TextBox1」などになります。「文字列から日付や時刻を変換するときに変換に失敗しました」というエラーが表示されます。誰かがこれで私を助けることができますか? テキストボックスと同じ「yyyy-mm-dd」形式の日付を使用するとうまく機能するため、混乱します。

4

3 に答える 3

7
protected void Button1_Click(object sender, EventArgs e) 
{ 
     con.Open(); 
     SqlCommand cmd1 = new SqlCommand(string.Format("insert into dbo.FillTable values ('{0}', '{1}', 'FA0005')", TextBox2.Text, TextBox1.Text), con); 
     SqlDataAdapter dr = new SqlDataAdapter(cmd1); 
     con.Close(); 
     DataSet dl = new DataSet(); 
     dr.Fill(dl); 
} 

string.Formatでは、機能を分解してみましょう。このように書式設定する文字列がある場合"Hello {0}!"、関数のゼロ インデックスで渡すものはすべて、出現する{0}. それで、私がこの文字列を持っていて、"Hello {0}, and I say again hello {0}!"それをこのように使用したとしましょう。string.Format("Hello {0}, and I say again hello {0}!", "world")このような文字列が得られます"Hello **world**, and I say again hello **world**!"

ノート

ただし、上記の解決策では SQL インジェクションにさらされる可能性があるため、それから保護したい場合は、このルートに進みましょう。

protected void Button1_Click(object sender, EventArgs e) 
{ 
     con.Open(); 
     SqlCommand cmd1 = new SqlCommand("insert into dbo.FillTable values (@TextBox2Val, @TextBox1Val, 'FA0005')", con); 
     cmd1.AddParameterWithValue( "TextBox1Val", TextBox1.Text );
     cmd1.AddParameterWithValue( "TextBox2Val", TextBox2.Text );
     SqlDataAdapter dr = new SqlDataAdapter(cmd1); 
     con.Close(); 
     DataSet dl = new DataSet(); 
     dr.Fill(dl); 
} 

これを分解してみましょう。SQL サーバーに送信されるステートメントは、文字列に が含まれている、まさにあなたが見るものです@paramname。ただし、それを として送信prepareし、メソッドで指定した値を使用してそのステートメントを準備しますAddParameterWithValue。ここで、 の値がTextBox2.Text日付である限り、SQL サーバーが処理するため、形式を気にする必要はありません。SQL サーバーはそれをある形式で保存し、別の形式で表示しますが、有効である限り、無数の形式から変換できることに注意してください。

さて、@Willemが述べたように、値TextBox2.Textが実際に日付であることを確認するのは当然のことなので、そうしましょう。このスニペットを関数の先頭に追加します...

DateTime theDate;
if (!DateTime.TryParse(TextBox2.Text, out theDate))
{
    // throw some kind of error here or handle it with a default value
    ... 
}

...そして、次のように行を変更しAddParameterWithValueます...

cmd1.AddParameterWithValue( "TextBox2Val", theDate );
于 2012-10-02T14:28:20.323 に答える
3

テキスト ボックスの値を正しく挿入するメカニズムがありません。さらに、このスタイルのデータベース挿入により、SQL インジェクション攻撃に対して脆弱になります。より良いオプションの 1 つは、次のように SqlCommand をパラメーター化することです。

 SqlCommand cmd1 = new SqlCommand("insert into dbo.FillTable values (@Date1, @Date2, @SomeString)",con);

次に、次のようにパラメーターを指定できます。

 cmd1.Parameters.AddWithValue("@Date1",TextBox1.Text);
 cmd1.Parameters.AddWithValue("@Date2",TextBox2.Text);
 cmd1.Parameters.AddWithValue("@SomeString,"FA0005");

パラメーターを指定すると、SQL インジェクションのリスクが排除され、テキスト ボックスから INSERT に値を取得するためのクリーンなメカニズムも提供されます。お役に立てれば。

于 2012-10-02T14:31:47.450 に答える
2

テキストボックスの値ではなく、テキスト「TextBox2.Text」をデータベースに入力しています。TextBox2.Text から引用符を削除します。

SqlCommand cmd1 = new SqlCommand("insert into dbo.FillTable values 
    ('" + TextBox2.Text + "', '" + TextBox1.Text + "', 'FA0005')",con);

上記のように、このように文字列を追加すると、 SQL インジェクションにさらされることになります。

于 2012-10-02T14:27:22.160 に答える