C# SQL查询,在SQL Server上执行时显示结果,但从C代码调用时不加载结果

C# SQL查询,在SQL Server上执行时显示结果,但从C代码调用时不加载结果,c#,sql-server,winforms,C#,Sql Server,Winforms,我有一个SQL Server查询;当我在SQLServer中运行它时,它返回预期的结果,当我从C代码调用相同的查询来填充数据集时,没有结果。有什么问题?我的SQL查询如下所示,以及在SQL Server中运行时的结果 SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus, t0.AddedBy , (SELECT AVG(CAST(brandID AS bigint))

我有一个SQL Server查询;当我在SQLServer中运行它时,它返回预期的结果,当我从C代码调用相同的查询来填充数据集时,没有结果。有什么问题?我的SQL查询如下所示,以及在SQL Server中运行时的结果

SELECT 
    t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus, 
    t0.AddedBy  , 
    (SELECT 
         AVG(CAST(brandID AS bigint)) FROM brands) AS brandID_AVERAGE
FROM 
    brands t0 
WHERE  
    t0.cdt >= '2013-11-15 00:00:00' 
    AND t0.cdt <='2013-11-15 23:59:59' 
GROUP BY
    t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus, t0.AddedBy
但是,当我使用command.Parameters.AddWithValue从C调用相同的东西时,我的数据集总是空的

我的c代码是

private void button1_Click(object sender, EventArgs e)
{
    checkedListBox1.Items.Clear();
    Cursor.Current = Cursors.WaitCursor;

    string QueryB=@"SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, 
        t0.brandstatus, t0.AddedBy, 
        ( SELECT  AVG( CAST (brandID AS bigint)) FROM brands ) 
          AS brandID_AVERAGE FROM brands t0 
             WHERE  t0.cdt >= @VALUE1 and  t0.cdt <=@VALUE2  
             group by t0.brandID,t0.brandName,t0.cdt,t0.udt,
                      t0.brandstatus,t0.AddedBy";

    if (textBox1.Text != string.Empty && textBox2.Text != string.Empty)
    {
        if (checkBox1.Checked == false)
        {
            try
            {
                if (QueryB != string.Empty)
                {
                    using (SqlConnection con = new SqlConnection(Properties.Settings.Default.connectionString))
                    {
                        con.Open();
                        SqlCommand cmd = new SqlCommand(QueryB, con);

                        if (checkBox6.Checked)
                        {
                            var sample1 = DateTime.ParseExact(textBox1.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd") + " " + dateTimePicker2.Value.ToString("HH:mm:ss tt");
                            var sample2 = DateTime.ParseExact(textBox2.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd") + " " + dateTimePicker1.Value.ToString("HH:mm:ss tt");

                            cmd.Parameters.AddWithValue("@Value1", sample1.ToString());
                            cmd.Parameters.AddWithValue("@Value2", sample2.ToString());
                        }
                        else
                        {
                            if (label2.Text.Contains("datetime"))
                            {
                                cmd.Parameters.AddWithValue("@Value1", DateTime.ParseExact(textBox1.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("MM-dd-yyyy") + " " + "00:00:00.000");
                                cmd.Parameters.AddWithValue("@Value2", DateTime.ParseExact(textBox2.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("MM-dd-yyyy") + " " + "23:59:59.999");
                            }
                            else
                            {
                                cmd.Parameters.AddWithValue("@Value1", textBox1.Text);
                                cmd.Parameters.AddWithValue("@Value2", textBox2.Text);
                            }
                        }

                        DataSet ds = new DataSet();

                        SqlDataAdapter da = new SqlDataAdapter(cmd);
                        cmd.ExecuteNonQuery();

                        da.Fill(ds);
                        con.Close();

                        dataGridView1.DataSource = ds.Tables[0];
                        mysource = ds.Tables[0];
                        dataGridView1.BindingContext = new BindingContext();
                        foreach (DataGridViewColumn col in dataGridView1.Columns)
                        {
                            checkedListBox1.Items.Add(col.HeaderText.ToString());

                        }

我不确定您的查询,但您的代码中很可能有一个罪魁祸首,那就是AddWithValue调用和datetime参数

代码将日期时间值转换为字符串,并将其传递给AddWithValue。此转换使用区域设置的规则进行。 AddWithValue不知道底层datatable列是DateTime,因此创建了字符串类型的参数。此时,参数被传递给需要将字符串值重新转换回DateTime的数据库引擎。此转换使用为数据库建立的规则进行,可能是某个值导致查询失败

只需使用Add方法指定确切的数据类型,并让数据库引擎从参数中正确提取值

cmd.Parameters.Add("@Value1", SqlDbType.DateTime).Value = sample1.Date; //2013/11/15 00:00:00
cmd.Parameters.Add("@Value2", SqlDbType.DateTime).Value = sample2.AddSeconds(86339); // 2013/11/15 23:59:59

我不确定您的查询,但您的代码中很可能有一个罪魁祸首,那就是AddWithValue调用和datetime参数

代码将日期时间值转换为字符串,并将其传递给AddWithValue。此转换使用区域设置的规则进行。 AddWithValue不知道底层datatable列是DateTime,因此创建了字符串类型的参数。此时,参数被传递给需要将字符串值重新转换回DateTime的数据库引擎。此转换使用为数据库建立的规则进行,可能是某个值导致查询失败

只需使用Add方法指定确切的数据类型,并让数据库引擎从参数中正确提取值

cmd.Parameters.Add("@Value1", SqlDbType.DateTime).Value = sample1.Date; //2013/11/15 00:00:00
cmd.Parameters.Add("@Value2", SqlDbType.DateTime).Value = sample2.AddSeconds(86339); // 2013/11/15 23:59:59

我想你需要换个新的 cmd.ExecuteNonQuery; 具有 cmd.ExecuteReader


虽然我无法测试,但我认为您需要更换 cmd.ExecuteNonQuery; 具有 cmd.ExecuteReader


虽然我没有办法测试

但您可能需要在每个日期的前后都有一个硬编码的单引号。像t0.cdt>='@VALUE1'一样,不要使用AddWithValue,尤其是当您想要传递日期时间值时,您可能需要在每个日期的前端和末尾使用硬编码的单引号。像t0.cdt>='@VALUE1'不要使用AddWithValue,特别是当您想要传递日期时间值时,我将其更改为您建议的方式,但仍然可能是相同的,因为这两个日期时间表示相同的时间点,您需要一整天的时间。更改了一点上面的答案我理解了问题我使用的日期和时间是2013年11月15日00:00:00 am这是可以的2013年11月15日24:00:00这不是sql server有15/11/2013 23:59:59.999这是更改到第二天,但我的查询没有转换为导致问题的日期或时间格式。我将其更改为您建议的方式,但仍然存在问题这很可能是因为两个日期时间代表相同的时间点,您需要一整天的时间。更改了一点上面的答案我理解了问题我使用的日期和时间是2013年11月15日00:00:00 am这是正常的2013年11月15日24:00:00这不是sql server有15/11/2013 23:59:59.999这是更改到第二天,但我的查询没有转换为导致问题的日期或时间格式。您可以尝试拔出数据适配器并试着执行阅读器,也许可以缩小范围。因此,很抱歉没有提供更多帮助,您可以尝试拔出数据适配器,然后尝试执行读取器,也许可以缩小范围。很抱歉没有更多的帮助