2

我正在尝试更新 Excel 工作表的单个单元格。请注意,在下面的示例代码中,我将变量用于列和行,因为这会根据程序的其他部分而改变,但出于调试目的,我将它们分别设置为 A 和 1。

现在我收到一条错误消息“查询表达式'06:31 PM'中的语法错误(缺少运算符)。

请不要简单地建议我参数化,因为我知道这不会解决我的问题而且我不担心注入。

提前谢谢大家。

        string newColumn = "A";
        string newRow = "1";
        string worksheet2 = strMonth;

        var cnnStr2 = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"", textBox1.Text);
        var cnn2 = new OleDbConnection(cnnStr2);

        cnn2.Open();

        string sql2 = String.Format("UPDATE [{0}$] SET {1}{2}={3}", worksheet2, newColumn, newRow, dtpTime.Text.Substring(0, 8));
        OleDbCommand objCmdSelect = new OleDbCommand(sql2, cnn2);
        objCmdSelect.ExecuteNonQuery();

        cnn2.Close();

编辑:根据 Gerhard 建议的链接,我已将命令文本更改为以下内容:

string sql2 = String.Format("UPDATE [{0}${1}{2}:{1}{2}] SET F1='{3}'", worksheet2, newColumn, newRow, dtpTime.Text.Substring(0, 8));

这现在会产生错误“操作必须使用可更新查询”。不知道现在该怎么办。{1}{2}:{1}{2} 给出了工作表 {0}$ 上的单个单元格范围,如果没有我在 HDR= 的连接字符串中指定的列名,则 F1 是给出的默认列名不。最后,{3} 是我用来更新单元格的子字符串,它用单引号括起来,因为这似乎是每个人都在做的事情。如果我删除单引号,它只会产生不同的错误。

4

2 回答 2

3

我编辑的命令字符串是正确的。但是为了摆脱新的错误,我不得不在连接字符串中取出“IMEX = 1”。不是 100% 确定为什么它会起作用,但确实如此。

在查找有关使用 oledb 命令的内容时,我注意到的一件事是,很多人,像我一样,似乎对命令的每个部分的实际作用感到困惑。我仍然不完全理解您可以添加到其中的一些特殊内容,例如“WHERE”,但我想在这里添加一些内容以帮助任何发现此问题并遇到类似问题的人。

在 SELECT 语句中,如果要选择单个单元格,可以使用如下内容:

string commandString = String.Format("SELECT * FROM [{0}${1}{2}:{1}{2}]", worksheetName, column, row);

“SELECT * FROM”将从“worksheetName”中选择所有内容。然后,您必须在工作表的名称后面加上“$”。接下来,“{1}{2}:{1}{2}”是您选择的单元格范围。在这里,通过使冒号两侧的列和行相同,您选择了单个单元格的范围。例如,“E3:E3”将仅选择单元格 E3 中的内容。

在 UPDATE 语句中,如果你想更新单个单元格,你可以使用类似的东西:

string commandString = String.Format("UPDATE [{0}${1}{2}:{1}{2}] SET F1='{3}'",worksheetName, column, row, data);

这里要注意的唯一区别是“SET F1='{3}'”。这会将您在范围内指定的单元格设置为数据变量中的内容。注意使用“F1”。这只是在连接字符串中指定“HDR=NO”时使用的默认值,换句话说,没有列标题或名称。如果您有列标题,您将使用它来代替 F1。重要的是在这里理解 F1 不以任何方式对应于单元格 F1。

于 2013-08-27T15:47:58.730 回答
0

我用这个问题度过了一个周末。最后,我可以解决。我将连接字符串更改为:

Microsoft.Jet.OLEDB.4.0;Data Source='文件路径';Extended Properties='Excel 8.0'

没有 IMEX 或 HDR 选项。以前,我检查并更改了 excel 文件中的细胞保护检查。我希望这对其他人有帮助。

于 2018-01-02T03:18:11.490 回答