【问题标题】:Error when execute query [closed]执行查询时出错[关闭]
【发布时间】:2014-08-27 22:21:00
【问题描述】:

这里是 C# 的代码 sn-p。我正在尝试生成数据摘要并在 asp.net 的 formview 中显示。但是这个代码生成错误有问题 'Incorrect syntax near 'K12'.' 请帮帮我。

            try
            {
                SqlConnection conn = new SqlConnection("server=ARSLAN-   LAPI\\SQLEXPRESS;" +
                              "Trusted_Connection=yes;" +
                              "database=OTTS; " +
                              "connection timeout=30");
                String query = "Select * FROM dbo.";
                query = query + " " + "[" + session.SelectedItem.Text + "_" +     dept.SelectedItem.Text + "]";
                query = query + " " + "WHERE rollNo=" + "2K12-BSCS-37";
                //SqlCommand cmd = new SqlCommand(query, conn);
                //SqlDataReader reader;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(query, conn);
                SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
                DataTable table = new DataTable();
                table.Locale = System.Globalization.CultureInfo.InvariantCulture;
                dataAdapter.Fill(table);
                dataform.DataSource = table;
                dataform.Visible = true;
            }
            catch (SqlException ex)
            {
                ErrorMessage.Text="Error ::"+ ex.Message;
            }

【问题讨论】:

  • 非常危险的代码。我希望您的用户无法写入这些下拉列表
  • 您的问题有几个问题:1)标题不清楚。 “对下面的 C# 代码感到困惑”并不是任何人都会在互联网上实际搜索的内容。更接近的问题标题是,“C# 中的语法错误(... 您正在尝试做什么...)” 2)我们没有您的数据库架构'正在看,所以我们不知道语法应该是什么。
  • @Steve 如果它们可以在表单中使用,它们很可能是可用的,因为最终用户可以使用包含任何他们想要的表单数据的表单来制作 HTTP 请求。 OP 必须进行某种验证以确保值在他们期望的范围内。
  • 如果我删除空间也同样的问题
  • @George:::Sir 我正在尝试将一些数据从数据库中的 formview 数据库名称为 '2K12_BSCS' 括在方括号中。当我从级联下拉列表中选择 2K12 和 BSCS 时,然后生成卷号的新下拉列表。选择卷号后,我想将特定卷号的所有数据添加到表格中。我是 asp.net 和 c# 的新手。

标签: c# asp.net sql sql-server webforms


【解决方案1】:

where 子句中的卷号字符串需要分隔为字符串。此行 query = query + " " + "WHERE rollNo=" + "2K12-BSCS-37"; 应替换为 query += " " + "WHERE rollNo=" + "'2K12-BSCS-37'"; 注意单引号。

最好还是使用字符串格式来构建查询,如下所示:

string.Format("SELECT * FROM dbo.[{0}_{1}] WHERE rollNo = '{2}'",
              session.SelectedItem.Text,
              dept.SelectedItem.Text,
              "2K12-BSCS-37")

更好的仍然是完全避免这种危险的查询,因为它会使您的数据库暴露在许多可能的攻击之下。老实说,我从来没有让用户以这种方式建立自己的表名,所以我什至不能说 SQLClient 参数是否可以在这里工作,尽管我希望他们不会。我同意以前的 cmets 需要进行大量的范围检查等才能使其可行。

最后,希望这是一个只有少数用户可以访问的内部应用程序。

【讨论】:

  • 谢谢先生,现在错误已删除,您能指导我如何将数据添加到 asp.net 的 formview 控件
  • 嗯,更短:查询 += " WHERE rollNo='2K12-BSCS-37'";顺便说一句,StringBuilder 更适合这个目的。当然,这里需要一个“参数化查询”,而不是直接将值连接到查询中。 (我没有投反对票。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2018-12-14
  • 2012-11-04
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多