1

私は C# と sql を初めて使用します。関数が特定のレコードのデータベース テーブルを検索する関数を C# に持っています。

 public string returnstudentdata(string primarykey, string table, string regno, string column)
    {
        string temp = "";
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }

        SqlCommand newCmd = conn.CreateCommand();
        newCmd.Connection = conn;
        newCmd.CommandType = CommandType.Text;
        newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";
        SqlDataReader dr = newCmd.ExecuteReader();
        while (dr.Read())
        {
            temp = dr[column].ToString();
        }
        dr.Close();
        conn.Close();
        return temp;
    }

このコードは正しく実行されますが、SqlDataReader dr = newCmd.ExecuteReader(); に関しては、次のような例外がスローされます。

System.Data.dll で 'System.Data.SqlClient.SqlException' 型の未処理の例外が発生しました

追加情報: 「=」付近の構文が正しくありません。

呼び出しステートメントは

 string regno = txtRegNo.Text;
 txtFName.Text = update.returnstudentdata("Regno","student",regno,"Fname");

私のコードの問題は何ですか.助けてください

4

5 に答える 5

3

少なくとも、SQL ステートメントにスペースが必要です。

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";
于 2013-01-09T15:34:55.650 に答える
2

引用符内の SQL キーワードの前後にスペースを入れると、文字列は有効な SQL コードになりません。

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";

また、セキュリティ上の理由から、自己組み立て文字列の代わりにパラメーター化されたクエリを使用することをお勧めします。コードは、SQL インジェクション攻撃などに対して脆弱です。

詳細については、この SO スレッドを参照してください:パラメータ化されたクエリは SQL インジェクションに対してどのように役立ちますか?

于 2013-01-09T15:35:22.880 に答える
1

これを試して:

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + " = '" + regno + "'";
于 2013-01-09T15:36:36.797 に答える
1

、またはSqlCommandTextクエリには、多くのエラーが発生する可能性があります。

1 つ目は、 などの SQL キーワードSELECTと変数の間にスペースを入れないことです (変数にスペースが埋め込まれていないと仮定します)。

newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";

最初に次のようにスペースを追加する必要があります。

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=" + regno + "";

regno2 つ目は、値を引用符で囲んでいないことです。これは、値が数値であるため有効である可能性があります。その場合は、引用符を無視することができ、クエリは正常に実行されます (上記のスペースを追加した後)。ただし、文字列の場合は、次のように値を引用符で囲みます。

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=\"" + regno + "\"";

ただし、値が数値であるか文字列であるかに関係なく、代わりにプリペアド ステートメントを使用することをお勧めします。これは次の方法で実現できます。

newCmd.CommandText = "SELECT " + column + " FROM " + table + " WHERE " + primarykey + "=@regNo";
newCmd.Parameters.AddWithValue("@regNo", regno);

準備されたステートメントは、値を引用符で囲むことを覚えておく必要性を軽減するのに役立ちます (自動的に処理されます)。また、SQL インジェクションを防ぐのに役立つため、クエリにセキュリティが追加されます。

于 2013-01-09T15:36:51.413 に答える
1

この行は有効な SQL を提供しません。場所がない。-

newCmd.CommandText = "SELECT" + column + "FROM" + table + "WHERE" + primarykey + "=" + regno + "";
于 2013-01-09T15:35:11.100 に答える