2014-02-06 84 views
0

我的工作,我需要从一个列表框,并从2日期选择器选择要显示在DataGridView中的代码的选择项选择查询。从列表框和日期范围

我的代码,第一个版本已经与刚才的日期范围的工作,但我已经包含列表框,我开始收到错误。

这里是我的查询:

private void button6_Click(object sender, EventArgs e) 
    { 
     OleDbDataAdapter ad = new OleDbDataAdapter("select * from customer where network_name=" + listBox1.SelectedItem.ToString() +" where date_loaded between #" + dateTimePicker1.Value.ToShortDateString() + "# and #" + dateTimePicker2.Value.ToShortDateString() + "#", mycon); 
     DataSet ds = new DataSet(); 
     ad.Fill(ds, "load"); 
     dataTable = ds.Tables["load"]; 

     if (ds.Tables[0].Rows.Count > 0) 
     { 
      dataGridView1.DataSource = ds; 
      dataGridView1.DataMember = ds.Tables[0].ToString(); 
     } 
    } 
+0

我想知道我的查询有什么问题 –

+0

接收到的错误是什么?正如迈克所说,这可能只是围绕字符串的引号而已。 –

+0

{ “语法错误(缺少操作者)在查询表达式 'NETWORK_NAME =智能只需惊人其中之间#2/6/2014年#和#2/7/2014年#date_loaded'。”}它是在ad.Fill(DS,“负载“); –

回答

4

网络名称是文本值,因此需要将其包裹在单引号。另外,你有两个其中条款。替换第二个与AND子句,并且在一组括号的包裹。试试这个:

OleDbDataAdapter ad = new OleDbDataAdapter("select * from customer where network_name='" + listBox1.SelectedItem.ToString() +"' AND (date_loaded between #" + dateTimePicker1.Value.ToShortDateString() + "# and #" + dateTimePicker2.Value.ToShortDateString() + "#)", mycon); 
+0

感谢:D它的工作! –

-1

你有两个在你的查询中,用第二个替换为和。

select * from customer where network_name=" + listBox1.SelectedItem.ToString() +" and date_loaded between #" + dateTimePicker1.Value.ToShortDateString() + "# and #" + dateTimePicker2.Value.ToShortDateString() + "#" 
1

请参数化您的查询。准备好的声明可以防范SQL注入攻击并且性能更好。参见:Give me parameterized SQL, or give me death

我已经不是我自己太熟悉OLEDB(更多MySQL的家伙),但它应该是这样的。

cmd.Connection = mycon; 
cmd.CommandText = "SELECT * FROM customer WHERE " + 
     "network_name = ? AND (date_loaded BETWEEN #?# and #?#)" 

cmd.Parameters.Add("@network_name", OleDbType.VarChar); 
cmd.Parameters.Add("@D1", OleDbType.DBDate); 
cmd.Parameters.Add("@D2", OleDbType.DBDate); 

cmd.Parameters["@network_name"].Value = listBox1.SelectedItem.ToString(); 
cmd.Parameters["@D1"].Value = dateTimePicker1.Value.ToShortDateString(); 
cmd.Parameters["@D2"].Value = dateTimePicker2.Value.ToShortDateString(); 


OleDbDataAdapter ad = new OleDbDataAdapter(cmd);