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;

好吧,它只是我从 google xD 获得的 2 个代码之间的混合,但错误出现在这里textbox2.Text ="Found "+ count+" Members;

4

4 回答 4

5

这行代码有几个问题:

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

首先,存在语法错误。你永远不会关闭第二组报价。你会这样做:

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

但是,像这样的字符串连接仍然有点混乱。您有两个文字字符串,并且您试图将它们添加到一个整数中,这并不完全直观(并且可能比它需要的要慢)。相反,请考虑使用格式化字符串:

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.text在您尝试在 SQL 查询中使用它之前检查和验证用户输入 ( )。
  • comm.ExecuteScalar()在尝试直接将其转换为 an 之前检查输出Int32(如果由于某种原因它返回整数以外的任何内容,这会给您一个运行时错误)。
  • 考虑使用 Linq to Sql 之类的东西来代替 ADO.NET 组件,因为它可以为您做更多的事情,而您的代码更少。
于 2013-03-08T12:48:24.027 回答
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 回答
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 回答