1

SQL Datareader を使用して、.aspx ページのテキスト ボックスに入力しています。私の下

#region "[--------Function To Fill Up All TextBox---------]>"
public void FillTextBox(string Sqlstring)
{


    SqlConnection Conn =  new SqlConnection(ConfigurationManager.ConnectionStrings["SQL Connection String"].ConnectionString);
    SqlDataReader MyDataReader = null;
    SqlCommand MyOleDbCommand = new SqlCommand();
    MyOleDbCommand.Connection = (Conn);
    Conn.Open();
    MyOleDbCommand.CommandText = Sqlstring;
    MyDataReader = MyOleDbCommand.ExecuteReader();
    try
    {

        while (MyDataReader.Read())
        {

            txtuniv.Text = (MyDataReader[0].ToString());
            txtcollrno.Text = (MyDataReader[1].ToString());
            /*txtLastName.Text = (MyDataReader[2].ToString());
            txtClass.Text = (MyDataReader[3].ToString());
            txtSession.Text = (MyDataReader[4].ToString());
            txtobt.Text = (MyDataReader[5].ToString());
            txttot.Text = (MyDataReader[6].ToString());

            */
        }
    }
    catch (System.Exception err)
    {
        MyDataReader.Close();
        Conn.Close();
        Conn.Dispose();
    }

}
#endregion

PageLoad() イベントで

    protected void Page_Load(object sender, EventArgs e)
{
    Label1.Text = User.Identity.Name.ToString();
 
    string SqlStr = null;
    SqlStr = "Select * from TB_User where UserID=" + Label1.Text;
    FillTextBox(SqlStr);
}

UserID と Password の列を持つテーブル TB_User があります。それぞれ値 test1 と test1 があります。しかし、次のエラーが発生します。

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'test1'.

Source Error:


Line 40:         Conn.Open();
Line 41:         MyOleDbCommand.CommandText = Sqlstring;
Line 42:         MyDataReader = MyOleDbCommand.ExecuteReader();
Line 43:         try
Line 44:         {
4

6 に答える 6

3

パラメータを一重引用符で囲むのを忘れています。

"Select * from TB_User where UserID='" + Label1.Text +"'";
  1. しかし、あなたはSQL-Injectionに対してオープンです。文字列を連結してクエリを作成しないでください。代わりにパラメーターを使用してください。
  2. 接続に使用using-statementします(および実装する他のすべてのものIDisposable)。Dispose は、usingエラーが発生した場合でも接続を閉じます。

次に例を示します。

using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL Connection String"].ConnectionString)) {
    var sql = "Select * from TB_User where UserID=@UserID";
    using (var cmd = new SqlCommand(sql, con)) {
        cmd.Parameters.AddWithValue("@UserID", Label1.Text);
        con.Open();
        using(var reader = cmd.ExecuteReader())
        {
            while(reader.Read())
            {
                // ...
            }
        }
    }
}
于 2012-10-15T08:44:51.627 に答える
2

UserID'はクエリでカプセル化する必要があります。

SqlStr = "Select * from TB_User where UserID='" + Label1.Text + "'";
于 2012-10-15T08:43:51.553 に答える
2

次のように変更してみてください。

SqlStr = "Select * from TB_User where UserID=" + Label1.Text;

に:

SqlStr = string.Format("Select * from TB_User where UserID='{0}'",Label1.Text);

元のバージョンのデータベースでは、列 Test1 を探しており、値 'Test1' と比較していないと考えています。

于 2012-10-15T08:44:02.420 に答える
1

これを試してください、ユーザーIDを引用符で囲みます

SqlStr = "Select * from TB_User where UserID='" + Label1.Text + "'";

コードでパラメーター化されたクエリを使用することを検討してください - SQL インジェクション攻撃を回避し、SQL 構文を損なう可能性のある偶発的な文字からあなたを救います

SqlStr = "Select * from TB_User where UserID=@UserID";
于 2012-10-15T08:44:49.893 に答える
1

あなたのコードはセキュリティの観点から見て悪いです。この行は、Sql インジェクションを要求しています。

SqlStr = "Select * from TB_User where UserID=" + Label1.Text;

また、何か問題が発生した場合にのみリソースを解放するため、オブジェクトは catch ではなく finally ブロックで破棄する必要があります。

3 番目と最後に、クエリで列名を指定し、その結果を教えてください。

于 2012-10-15T08:45:47.893 に答える