0

こんにちは、stackoverflowを初めて使用するので、皆さんこんにちはL)

私はC#フォームの初心者ですが、それを楽しい趣味としています。

SqlCommand comm = new SqlCommand("SELECT COUNT(*) FROM Members where sponser = "
        +textbox1.text+"'", connection);

 Int32 count = (Int32)comm.ExecuteScalar();
 textbox2.Text ="Found "+ count+" Members;

さて、私がグーグルxDから得た2つのコードのちょうどミックスですが、エラーがここに表示されますtextbox2.Text = "Found" + count + "Members;

4

4 に答える 4

5

このコード行には、いくつか問題があります。

textbox2.Text ="Found "+ count+" Members;

まず、構文エラーがあります。2番目の引用符のセットを閉じることはありません。あなたはこのようにします:

textbox2.Text ="Found "+ count+" Members";

ただし、このような文字列の連結はまだ少し厄介です。2つのリテラル文字列があり、それらを整数に追加しようとしていますが、これは完全に直感的ではありません(おそらく、必要以上に遅くなります)。代わりに、フォーマット文字列の使用を検討してください。

textbox2.Text = string.Format("Found {0} Members", count);

これにより、count(整数である)から値が取得され、string.Format()関数の内部でその文字列表現が識別され、フォーマットされた文字列のプレースホルダーに挿入されます。

更新:コンパイル時のエラーを処理します。これで、実行時エラーが発生します。

SqlCommand comm = new SqlCommand("SELECT COUNT(*) FROM Members where sponser = "
    +textbox1.text+"'", connection);

そのSQLステートメントを実行しようとするとすぐに、結果のクエリに構文エラーがあるため、データベースからエラーが発生します。

SELECT COUNT(*) FROM Members where sponser = some text'

パラメータの最初の単一引用符がありません。このようなもの:

SqlCommand comm = new SqlCommand("SELECT COUNT(*) FROM Members where sponser = '"
    +textbox1.text+"'", connection);

ただし、これは重要ですが、まだ完了していません。このコード行は、SQLインジェクションと呼ばれる非常に一般的で簡単に悪用可能な脆弱性に対して広く開かれています。直接の文字列連結から離れて、SQLクエリにパラメータを使用することをお勧めします。このようなもの:

SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Members where sponser = @sponser");
cmd.Parameters.Add("@sponser", textbox1.text);
Int32 count = (Int32)comm.ExecuteScalar();

これを改善するためにできることはまだたくさんあることを知ってください。これはすべて、時間をかけて学ぶ価値があります。調べることができるものは次のとおりです。

  • textbox1.textSQLクエリで使用する前に、ユーザー入力()をチェックして検証します。
  • comm.ExecuteScalar()に直接キャストしようとする前にの出力を確認しますInt32(これにより、何らかの理由で整数以外のものが返される場合、ランタイムエラーが発生します)。
  • ADO.NETコンポーネントの代わりにLinqtoSqlのようなものを使用することを検討してください。これにより、コードが少なくて済みます。
于 2013-03-08T12:48:24.027 に答える
0

最後に「クロージング」がありません。

textbox2.Text ="Found "+ count+" Members";
于 2013-03-08T12:49:46.307 に答える
0

コードはSQLインジェクションに対して脆弱です。パラメータの使用を検討してください。

private int GetMemberCount(string connectionString, string sponsor)
{
    using(var connection = new SqlConnection(connectionString))
    using(var command = connection.CreateCommand())
    {
        command.CommandText = "SELECT COUNT(*) FROM members WHERE sponsor = @Sponsor";
        command.Parameters.AddWithValue("@Sponsor", sponsor);

        return Convert.ToInt32(command.ExecuteScalar());
    }
}

//Usage
var sponsor = textbox1.text;
var count = GetMemberCount(connectionString, sponsor);

textbox2.Text = string.Format("Found {0} Members", count);
于 2013-03-08T12:54:00.617 に答える
0
protected void Page_Load(object sender, EventArgs e)
{
    lb1.Text = GetRecordCount(textbox2.Text).ToString();
}

private int GetRecordCount(string myParameter)
{
    string connectionString = ConfigurationManager.ConnectionStrings["DBConnection"].ToString();
    Int32 count = 0;
    string sql = "SELECT COUNT(*) FROM members WHERE sponsor = @Sponsor";
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.Add("@Sponsor", SqlDbType.VarChar);
        cmd.Parameters["@Sponsor"].Value = myParameter;
        try
        {
            conn.Open();
            count = (Int32)cmd.ExecuteScalar();
        }
        catch (Exception ex)
        {

        }
    }
    return (int)count;
}
于 2013-03-08T14:30:01.170 に答える