【问题标题】:I want to retrieve multiple data from my data base. Im using C# and sql server我想从我的数据库中检索多个数据。我使用 C# 和 sql server
【发布时间】:2017-04-28 15:14:48
【问题描述】:

这是我的代码,如果我只给一列它可以工作,我无法检索多个数据,但是当我给多列它不工作时,我使用 c# 和 sql server。

 SqlConnection con3 = new SqlConnection(conString);
 con3.Open();
 if (con3.State == System.Data.ConnectionState.Open)
 {
     string s = "SELECT ([reg_grade] ,[t_name],[start_time], [end_time]) from addteacher where class_id='" + comboBox2.SelectedItem.ToString() + "' ";
     SqlCommand cm = new SqlCommand(s, con3);
     SqlDataReader dr1 = cm.ExecuteReader();
     while (dr1.Read())
     {
         grade_att.Text = (dr1["reg_grade"]).ToString();
         tname_att.Text = (dr1["t_name"]).ToString();
         stime.Text = (dr1["start_time"]).ToString();
         etime.Text = (dr1["end_time"]).ToString();
     }
 }
 con3.Close();

【问题讨论】:

  • 不起作用,请澄清。参见 Sql injection,无需检查连接是否打开,您在上一行打开它。对 SqlConnectioin 使用 using 或 try/catch/finally。更好的 SqlDataAdapter 再次包裹在 using 块中,并将数据填充到数据集中。
  • 它不起作用是什么意思?您收到错误消息吗?
  • 它可能“不起作用”,因为他将结果设置为文本字段,所以它只显示查询的最后一行......
  • 您需要比“不起作用”更具体。如果您使用SELECT * FROM ... 而不是指定一堆列会怎样?

标签: c# sql-server database string multiple-columns


【解决方案1】:

我不知道这是否是问题所在,但我从未见过用括号括起来的列名。 试试

"SELECT [reg_grade], [t_name], [start_time], [end_time] from addteacher where class_id='" + ...

【讨论】:

  • System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常附加信息:“,”附近的语法不正确。
  • string s = "SELECT (reg_grade ,t_name,start_time,end_time) from addteacher where class_id='" + gg + "' "; SqlCommand cm = new SqlCommand(s, con3); SqlDataReader dr1 = cm.ExecuteReader();
  • 您的代码仍然无效。见我上面的回复。是 (....) 破坏了事物。删除括号。将它们放在那里时,您无法查询多个字段。
【解决方案2】:

由于字段名称周围有括号,您的 SQL 语句无效。

改变这个:

string s = "SELECT ([reg_grade] ,[t_name],[start_time], [end_time])..."

看起来像这样:

string s = "SELECT [reg_grade] ,[t_name],[start_time], [end_time]..."

希望对您有所帮助。

您应该尝试在您的帖子中发送完整的错误/异常描述。这不仅可以让您自己识别问题,还有助于在此处回答您的问题。

【讨论】:

  • 你的第一个例子省略了左括号
  • 这个。而且,如果您想保存从查询中获得的所有数据,您需要将其添加到列表中。现在,您在每次运行 While 时设置查询结果,所以当它完成时,它只会显示查询的最后一行
【解决方案3】:

@mybirthname 在很多方面都是正确的。

使用 SQL 包装器

我喜欢使用 StackExchange 制作的 Dapper Dot Net。当您编写自己的 sql 以从数据库中提取数据时,非常好且易于使用。值得使用参数化查询;这应该帮助(松散地使用)以避免编写容易受到 sql 注入攻击的不安全 sql 语句。请记住,您必须以这样的方式编写 SQL,以避免 sql 注入 Owasp SQL Injection Information

它还有助于处理here in another question 解释的一系列问题

回到问题..

我建议打开 SQL Management Studio(甚至是 LinqPad)并尝试自己运行查询。我确定问题是基于选择:

SELECT ([reg_grade] ,[t_name],[start_time], [end_time]) from addteacher

这应该是

SELECT [reg_grade] ,[t_name],[start_time], [end_time] from addteacher

如果您先在 SQL 中测试查询,则可以轻松识别查询中的错误。

@Jacopo 和@K.Berger 对参数周围的括号很感兴趣,我太慢了:) 但这并没有解决 SQL 注入的安全风险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2015-07-04
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多