【问题标题】:C# SQL query returns nothingC# SQL 查询不返回任何内容
【发布时间】:2012-05-19 03:08:42
【问题描述】:

我正在尝试让我的 Winforms 应用程序查询 SQL Server CE 数据库并通过下拉列表返回与用户指定的列名相对应的所有行。当我运行程序时,它只会返回一个空白的 dataGrid。这是我第一次使用 SQL Server CE,因此将不胜感激。

我的代码是:

private void srchBTN_Click(object sender, EventArgs e)
{
   string conString = Properties.Settings.Default.CurricularChangeTrackerConnectionString;

   using (SqlCeConnection conn = new SqlCeConnection(conString))
   {
       string queryString = ("SELECT * FROM SecondaryEducation WHERE ProgramCode='" + PrgmCde.SelectedValue + "'");

       try
       {
          conn.Open();

          using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(queryString, conn))
          {
              DataTable table = new DataTable();
              adapter.Fill(table);

              dataGridView1.DataSource = table;
              adapter.Dispose();
          }

          conn.Close();
       }
       catch (Exception ex)
       {
           MessageBox.Show(ex.Message);
       }
   }
}

【问题讨论】:

  • 当您获取位于queryString 中的查询(例如通过在调试器中设置断点)然后使用 SQL Server Management Studio 直接针对数据库运行该查询时会发生什么?
  • 能否在这一行断点 dataGridView1.DataSource = table;并确保表格中填充了一些东西?
  • 当你说“空白”数据网格时,它至少有列吗?如果是这样,那么您的查询返回正常,但您没有符合您的条件的数据!
  • 你知道你构建查询的方式有很高的SQL注入风险吗?
  • 在查看表格时,我在 dataGridView1 行上打断,它显示所有列,但列标题下方没有任何内容。至于 SQL 注入,是什么导致它成为高风险用户只能基于无法编辑的下拉列表进行查询?正如我所说,我以前从未使用过 SQL,因此感谢您提供任何信息。谢谢

标签: c# sql sql-server-ce


【解决方案1】:

如果 ValueMember 中没有指定属性,则 SelectedValue 返回对象的 ToString 方法的结果。

我的意思是,您可能无法从组合框中得到您的想法。

试试这个:

string queryString = ("SELECT * FROM SecondaryEducation WHERE ProgramCode='" + PrgmCde.Items[PrgmCde.SelectedIndex].ToString() + "'");

【讨论】:

    【解决方案2】:

    你在 using 语句中声明数据表,试试这个

    private void srchBTN_Click(object sender, EventArgs e)
    {
       string conString = Properties.Settings.Default.CurricularChangeTrackerConnectionString;
       DataTable table = new DataTable();
       using (SqlCeConnection conn = new SqlCeConnection(conString))
       {
         string queryString = ("SELECT * FROM SecondaryEducation WHERE ProgramCode='" + PrgmCde.SelectedValue + "'");
    
       try
       {
          conn.Open();
    
          using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(queryString, conn))
          {
    
              adapter.Fill(table);
              dataGridView1.DataSource = table;
              adapter.Dispose();
          }
    
          conn.Close();
       }
       catch (Exception ex)
       {
           MessageBox.Show(ex.Message);
       }
      }
    }
    

    这样,当 using 语句的作用域结束时,表就不会被销毁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 2012-04-14
      • 2020-09-25
      • 1970-01-01
      • 2021-04-24
      相关资源
      最近更新 更多