【问题标题】:Create Table with Parameters创建带参数的表
【发布时间】:2015-08-05 00:05:02
【问题描述】:

我想创建一个 Excel 表格,使用 OleDb:

OleDbCommand oleDbCommand = new OleDbCommand();
oleDbCommand.Connection = oleDbConnection;

String commandText = "CREATE TABLE" + " [" + sheetModel.Sheet.Name + "] ";
commandText += "(";

for (int index = 0; index < spalten; index++)
{
    String _header = sheetModel.DT1.Rows[heaader].ItemArray[index].ToString();

    oleDbCommand.Parameters.Add(new OleDbParameter("@var" + (index + 1).ToString(), _header));

    if (index > 0)
    {
        commandText += ", ";
    }

    commandText += "@var" + index.ToString() + " VARCHAR";
}
commandText += ");";


try
{
    oleDbCommand.CommandText = commandText;
    oleDbCommand.ExecuteNonQuery();
    oleDbCommand.Parameters.Clear();
}
catch (Exception exception)
{
    MessageBox.Show(exception.Message);
    return;
}  

Excel 表格的结果是,

@var0 @var1 @var2 @var3 @var4 @var5

但我应该是这样的:

"PREIS/Stk. EURO" "Stk." "" "产品" "Artikelmerkmale" "Sonstige"

我的错误在哪里?
该代码可以正常插入值。

【问题讨论】:

  • 我不知道您的确切问题是什么...您的主要问题是表中的第一行不包含正确的标题标题(PreisStückProdukt 等),而是使用 @var1-5 或其他?
  • 您在哪里提供字符串中的标题标题?你只是在循环中提供@var+(index + 1)。
  • @M463:是的,你是对的,这是我的问题!
  • @learningNew: String _header = sheetModel.DT1.Rows[header].ItemArray[index].ToString(); // DT1 = 带有信息的数据表...

标签: c# sql excel oledb oledbcommand


【解决方案1】:

正如 learningNew 所说,您只是在循环中提供 @var+(index + 1) 作为列标题。

要更正此问题,您可以包含 switch 条件以根据当前迭代周期提供实际的列标题。

为此,请更改行

oleDbCommand.Parameters.Add(new OleDbParameter("@var" + (index + 1).ToString(), _header));

到这样的东西(未经测试):

string colHeader = string.Empty;  // variable for the column header

switch (index)
{
    case 0:
        colHeader = "Preis/Stk. EURO";
    case 1:
        colHeader = "Stk.";
    case 2:
        colHeader = "Produkt";
    default:
        break;
}

// using the string variable here to set the actual column header
oleDbCommand.Parameters.Add(new OleDbParameter(colHeader, _header));

【讨论】:

  • 其他问题:我可以创建没有列名的表吗?
  • 我对在 Excel 中创建表格的 OleDb 语法并不坚定,因为我一直直接使用 Excel 互操作性,因为它允许进一步交互,例如访问给定单元格的标记。如果您为列标题提供string.Emtpy 会发生什么?我假设代码会崩溃,因为缺少列标题将意味着缺少字段标识符,这意味着您的查询将不知道将数据填充到哪一列,但如果我在这里错了,请纠正我。
【解决方案2】:

1) 我创建了一个包含列名称的表:F1、F2、...

2)我用动态名称更新了列名称(F1,F2,...也是动态创建的)

String _Header = "PREIS/Stk. EURO"
oleDbCommand.CommandText = "UPDATE[MySheet] SET F1 = @var";
oleDbCommand.Parameters.Add(new OleDbParameter("@var", _header));

就是这样!

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多