You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询在SSMS/VS工具正常,C#程序运行无数据问题解决

SQL查询在SSMS/VS工具正常运行,但集成到C#后无数据返回的解决方法

我编写的SQL查询关联tbl_vehiculos、tbl_facturas、tbl_bitacora三张表,使用DECLARE定义参数,在SSMS和Visual Studio的SQL工具中均可正常运行并返回预期的车辆信息,但将查询集成到C#程序中运行时,DataGridView仅显示列头,无数据返回。尝试转换日期参数类型等操作均未解决问题,最终通过将查询中的NOT IN替换为NOT EXISTS,并将WHERE子句中车辆燃料类型的判断条件从AND改为OR,成功解决问题。

初始SQL查询

DECLARE @fecha DATE;
DECLARE @tipocombustible INT;
DECLARE @tipocombustible2 INT;

SET @fecha = '2021-01-26';
SET @tipocombustible = 15101514;
SET @tipocombustible2 = 15101515;

SELECT DISTINCT 
    tbl_vehiculos.idtbl_vehiculos AS ID,
    TRIM (' ' FROM tbl_vehiculos.marca) + ' ' + 
        TRIM(' ' FROM tbl_vehiculos.tipo) + ' ' + 
        TRIM(' ' FROM tbl_vehiculos.modelo) AS 'Vehiculo',
    tbl_vehiculos.placas AS 'Placa',
    tbl_vehiculos.tanque AS 'Capacidad',
    tbl_vehiculos.rendimiento AS 'Kms/Ltr'
FROM
    tbl_vehiculos 
INNER JOIN 
    tbl_facturas ON bl_facturas.idtbl_tipocombust = tbl_vehiculos.idtbl_tipocombust 
LEFT JOIN 
    tbl_bitacora ON tbl_bitacora.fecha_carga = tbl_facturas.fecha 
                 AND tbl_bitacora.idtbl_vehiculos = tbl_vehiculos.idtbl_vehiculos
WHERE 
    tbl_vehiculos.idtbl_tipocombust = @tipocombustible 
    AND tbl_vehiculos.idtbl_tipocombust2 = @tipocombustible2 
    AND tbl_bitacora.fecha_carga NOT IN (SELECT tbl_bitacora.fecha_carga 
                                         FROM tbl_bitacora 
                                         WHERE tbl_bitacora.fecha_carga = @fecha 
                                           AND tbl_bitacora.idtbl_vehiculos = tbl_vehiculos.idtbl_vehiculos);

初始C#代码

private void facturasGrid_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (facturasGrid.SelectedRows.Count != 0)
    {
        DataGridViewRow row = this.facturasGrid.SelectedRows[0];

        int combustible1 = Convert.ToInt32(row.Cells["Clave"].Value);
        int combustible2 = Convert.ToInt32(row.Cells["Clave"].Value);
        var fecha = Convert.ToDateTime(row.Cells["Fecha"].Value).ToString("yyyy-MM-dd");
        textBox7.Text = fecha.ToString();
        actualizar_vehiculos(combustible1, combustible2, fecha);
        dateTimePicker1.Value= Convert.ToDateTime(fecha);
    }
}

private void actualizar_vehiculos (int c1,int c2, string fecha)
{
    try
    {
        string conceptos = "SELECT DISTINCT tbl_vehiculos.idtbl_vehiculos AS ID,\r\nTRIM (' ' FROM tbl_vehiculos.marca)+' '+TRIM(' ' FROM tbl_vehiculos.tipo)+' '+TRIM(' ' FROM tbl_vehiculos.modelo) AS 'Vehiculo', "+
                    "\r\ntbl_vehiculos.placas AS 'Placa', " +
                    "\r\ntbl_vehiculos.tanque AS 'Capacidad'," +
                    "\r\ntbl_vehiculos.rendimiento AS 'Kms/Ltr' " +
                    "\r\nFROM tbl_vehiculos " +
                    "\r\nINNER JOIN tbl_facturas ON tbl_facturas.idtbl_tipocombust=tbl_vehiculos.idtbl_tipocombust " +
                    "\r\nLEFT JOIN tbl_bitacora ON tbl_bitacora.fecha_carga=tbl_facturas.fecha AND tbl_bitacora.idtbl_vehiculos=tbl_vehiculos.idtbl_vehiculos " +
                    "\r\nWHERE tbl_vehiculos.idtbl_tipocombust=@tipocombustible and tbl_vehiculos.idtbl_tipocombust2=@tipocombustible2 AND tbl_bitacora.fecha_carga NOT IN (SELECT tbl_bitacora.fecha_carga FROM tbl_bitacora WHERE tbl_bitacora.fecha_carga=@fecha AND tbl_bitacora.idtbl_vehiculos=tbl_vehiculos.idtbl_vehiculos)";

        using (connection = new SqlConnection(connectionString))
        {
            connection.Open();

            SqlCommand comando = new SqlCommand(conceptos, connection);
            comando.Parameters.AddWithValue("@tipocombustible", c1);
            comando.Parameters.AddWithValue("@tipocombustible2", c2);
            comando.Parameters.AddWithValue("@fecha", Convert.ToDateTime(fecha));

            SqlDataAdapter adapter = new SqlDataAdapter(comando);
            comando.ExecuteScalar();

            DataSet datos = new DataSet();
            adapter.Fill(datos);

            vehiculosGrid.ReadOnly = true;
            vehiculosGrid.DataSource = datos.Tables[0];
            vehiculosGrid.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            vehiculosGrid.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            vehiculosGrid.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            vehiculosGrid.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            vehiculosGrid.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            textBox7.Text = vehiculosGrid.RowCount.ToString();

            // Now that DataGridView has calculated it's Widths; we can now store each column Width values.
            for (int i = 0; i <= vehiculosGrid.Columns.Count - 1; i++)
            {
                // Store Auto Sized Widths:
                int colw = vehiculosGrid.Columns[i].Width;

                // Remove AutoSizing:
                vehiculosGrid.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

                // Set Width to calculated AutoSize value:
                vehiculosGrid.Columns[i].Width = colw;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

修改后的C#代码与查询

private DataSet actualizar_vehiculos(int c1, int c2, DateTime fecha)
{
    string conceptos = @"
SELECT DISTINCT v.idtbl_vehiculos AS ID,
    TRIM (' ' FROM v.marca)+' '+TRIM(' ' FROM v.tipo)+' '+TRIM(' ' FROM v.modelo) AS 'Vehiculo',
    v.placas AS 'Placa', 
    v.tanque AS 'Capacidad',
    v.rendimiento AS 'Kms/Ltr' 
FROM tbl_vehiculos v
INNER JOIN tbl_facturas f ON f.idtbl_tipocombust=v.idtbl_tipocombust 
LEFT JOIN tbl_bitacora b ON b.fecha_carga=f.fecha 
     AND b.idtbl_vehiculos=v.idtbl_vehiculos 
WHERE NOT EXISTS (
           SELECT fecha_carga 
           FROM tbl_bitacora 
           WHERE fecha_carga=@fecha 
               AND idtbl_vehiculos=v.idtbl_vehiculos
    ) AND v.idtbl_tipocombust=@tipocombustible 
    OR v.idtbl_tipocombust2=@tipocombustible2";

    var datos = new DataSet();
    using (connection = new SqlConnection(connectionString))
    using (var comando = new SqlCommand(conceptos, connection))
    using (var adapter = new SqlDataAdapter(comando))
    {
        comando.Parameters.Add("@tipocombustible", SqlDbType.Int).Value = c1;
        comando.Parameters.Add("@tipocombustible2", SqlDbType.Int).Value = c2;
        comando.Parameters.Add("@fecha", SqlDbType.Date).Value = fecha;

        adapter.Fill(datos);
    }
    return datos;
}

内容的提问来源于stack exchange,提问作者Squalfenix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:44:52