峰峦@叠嶂 2024-08-11 16:46 采纳率: 99.5%
浏览 4
已结题

表格模板导入,查询内容的问题

需要导入小盒码的表格模板后,从数据库里面根据小盒码表格内的数据,查询出其他关联信息,以下是我的查询代码,模板的截图如下,现在导入后,查询没到内容,若单个将小盒码直接写在代码中,是可以查询出来的,请看看有什么问题吗,谢谢;

img


private void btncheck_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog1 = new OpenFileDialog
    {
        Title = "选择Excel文件",
        Filter = "Excel文件|*.xls;*.xlsx;*.xlsm",
        Multiselect = false
    };

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        // 获取用户选择的文件路径
        string filePath = openFileDialog1.FileName;

        try
        {
            using (var package = new ExcelPackage(new FileInfo(filePath)))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0];

                // 获取工作表的行数和列数
                int rowCount = worksheet.Dimension.Rows;
                int colCount = worksheet.Dimension.Columns;

                // 创建 DataTable 列
                for (int col = 1; col <= colCount; col++)
                {
                    dt.Columns.Add(worksheet.Cells[1, col].Text); // 使用第一行作为列名
                }

                // 创建 DataTable 行
                for (int row = 2; row <= rowCount; row++)
                {
                    var newRow = dt.NewRow();
                    for (int col = 1; col <= colCount; col++)
                    {
                        newRow[col - 1] = worksheet.Cells[row, col].Text; // 获取单元格的文本值
                    }
                    dt.Rows.Add(newRow);
                }
            }

            // 遍历每个“小盒码”并查询数据库
            foreach (DataRow row in dt.Rows)
            {
                string smallBoxCode = row["小盒码"].ToString();

                // 执行数据库查询操作
                string connectionString = "server=192.168.4.200;database=BCM30_DrugAdmin;user=sa;password=sskyadmin1!";

                string query = @"SELECT dr.batchNo, dr.parentCode2, wo.orderCode,wd.customerName,wd.orderType,wo.createTime,wo.updateTime FROM  dbo.da_codeRelation_193815500501 dr
                                 JOIN dbo.da_warehouseOutCode wo ON dr.parentCode2 = wo.code20 
                                 JOIN dbo.bcm_warehouseOrder wd on  wo.orderCode = wd.orderCode 
                                 WHERE dr.code20 = @SmallBoxCode";

                using (SqlConnection Conn = new SqlConnection(connectionString))
                {
                    SqlCommand command = new SqlCommand(query, Conn);

                    command.Parameters.AddWithValue("@SmallBoxCode", smallBoxCode);

                    Conn.Open();

                    SqlDataReader reader = command.ExecuteReader();

                    // 将查询结果显示在datagridview中
                    DataTable resultDt = new DataTable();

                    resultDt.Load(reader);                      

                    dataGridView1.DataSource = resultDt;
                }

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
     
    }
}
  • 写回答

2条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    你的代码中有几个问题:

    1. foreach 循环内部,直接使用 row 对应 dt.Rows.Add(newRow); 来添加新行会导致错误。你需要获取当前行(row变量)然后再向其中添加数据。

      修改后的代码:

    for (int row = 0; row < dt.Rows.Count; row++)
    {
        var newRow = dt.NewRow();
        for (int col = 1; col <= colCount; col++)
        {
            newRow[col - 1] = worksheet.Cells[row, col].Text;
        }
        dt.Rows.Add(newRow);
    }
    
    1. using (var package = new ExcelPackage(new FileInfo(filePath))) 语句需要关闭。你可以使用 using (var package = new ExcelPackage(new FileInfo(filePath))) 或者 using (var package = new ExcelPackage(filePath)) { } 来代替。

      修改后的代码:

    using (var package = new ExcelPackage(new FileInfo(filePath)))
    {
        ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
        
        // 获取工作表的行数和列数
        int rowCount = worksheet.Dimension.Rows;
        int colCount = worksheet.Dimension.Columns;
        
        // 创建 DataTable 列
        for (int col = 1; col <= colCount; col++)
        {
            dt.Columns.Add(worksheet.Cells[1, col].Text); // 使用第一行作为列名
        }
        
        // 创建 DataTable 行
        for (int row = 2; row <= rowCount; row++)
        {
            var newRow = dt.NewRow();
            for (int col = 1; col <= colCount; col++)
            {
                newRow[col - 1] = worksheet.Cells[row, col].Text;
            }
            dt.Rows.Add(newRow);
        }
    }
    
    1. 代码中的数据库查询字符串参数不是必需的。如果只需要一个空字符串来设置查询条件,可以删除 query = @"..." 和参数 @SmallBoxCode

      修改后的代码:

    string connectionString = "server=192.168.4.200;database=BCM30_DrugAdmin;user=sa;password=sskyadmin1!";
    
    // 遍历每个“小盒码”并查询数据库
    foreach (DataRow row in dt.Rows)
    {
        string smallBoxCode = row["小盒码"].ToString();
    
        // 设置查询条件为小盒码
        connectionString = "server=192.168.4.200;database=BCM30_DrugAdmin;user=sa;password=sskyadmin1!";
    
        string query = @"SELECT dr.batchNo, dr.parentCode2, wo.orderCode,wd.customerName,wd.orderType,wo.createTime,wo.updateTime FROM  dbo.da_codeRelation_193815500501 dr
                                     JOIN dbo.da_warehouseOutCode wo ON dr.parentCode2 = wo.code20 
                                     JOIN dbo.bcm_warehouseOrder wd on  wo.orderCode = wd.orderCode 
                                     WHERE dr.code20 = @SmallBoxCode";
    
        using (SqlConnection Conn = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(query, Conn);
    
            command.Parameters.AddWithValue("@SmallBoxCode", smallBoxCode);
    
            Conn.Open();
    
            SqlDataReader reader = command.ExecuteReader();
    
            // 将查询结果显示在datagridview中
            DataTable resultDt = new DataTable();
    
            resultDt.Load(reader);                      
    
            dataGridView1.DataSource = resultDt;
        }
    }
    

    以上是对你的代码的改进。你应该能成功解决问题了。如果你仍然遇到问题,请提供更多有关问题的信息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月19日
  • 已采纳回答 8月11日
  • 修改了问题 8月11日
  • 创建了问题 8月11日

悬赏问题

  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?
  • ¥100 需要跳转番茄畅听app的adb命令