我正在尝试阅读一张excel表,然后通过OleDb创建另一张excel表
在另一张excel表中,我制作了一些名字,如名字字符(10),年龄数
现在当我读取excel表并尝试在另一个excel表中插入值时,值会插入,但也包含一个额外的char,即单引号(')作为第一个char。
为什么所有值都以单引号输入到实际值?如何摆脱它?我正在使用c#.net。
@Edit
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = System.Data.CommandType.Text;
cmd.Connection = con;
cmd.CommandText = "CREATE TABLE Data1 (Name char(10), Age char(10)) ";
cmd.ExecuteNonQuery();
foreach (DataRow row in someDataTable.Rows)
{
cmd.CommandText = "INSERT INTO Data1 values ('" + row["Name"] +
"','" + row["Age"] + "')";
cmd.ExecuteNonQuery();
}
我在someDataTable中的数据与我需要复制的excel中的数据完全相同。
答案 0 :(得分:2)
这很奇怪,但也许是OleDb尝试避免SQL注入的某种尝试? (如果row["Name"]
包含单引号怎么办?)即使它没有解释,如@Treb所说,为什么只有一个引号,没有尾随引用。
如果您尝试将查询与参数一起使用会发生什么,例如:
using (OleDbCommand addLine = new OleDbCommand("INSERT INTO Data1 values (@name, @age)"))
{
addLine.Parameters.AddWithValue("@name", row["Name"]);
addLine.Parameters.AddWithValue("@age", row["Age"]);
int affectedRows = addLine.ExecuteNonQuery();
Debug.Assert(1 == affectedRows);
}
经过几次尝试,我仍然无法重现观察到的行为。我建议做几件事:
在您的问题中发布产生单引号问题的完整源代码,
尝试使用以下源代码(控制台应用程序),看看会发生什么。就我而言,值插入良好,没有任何前导单引号。唯一的问题是年龄,插入为文本而不是数字(可以通过明确指定行的类型来解决):
源代码:
namespace Demos.StackOverflow.ExcelUpdate
{
using System;
using System.Collections.ObjectModel;
using System.Data.OleDb;
class Program
{
static void Main(string[] args)
{
// -> Change the following name of the file to use.
string fullPath = @"C:\Users\Arsene\Desktop\Book1.xlsx";
string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0'", fullPath);
Collection<Tuple<string, int>> dataToPut = new Collection<Tuple<string, int>>();
dataToPut.Add(new Tuple<string, int>("Some name", 34));
dataToPut.Add(new Tuple<string, int>("Other name here", 41));
dataToPut.Add(new Tuple<string, int>("Last one", 36));
using (OleDbConnection oleConnection = new OleDbConnection(connectionString))
{
oleConnection.Open();
using (OleDbCommand createTable = new OleDbCommand("create table Data1 (Name char(10), Age char(10))", oleConnection))
{
createTable.ExecuteNonQuery();
}
foreach (var t in dataToPut)
{
using (OleDbCommand addItem = new OleDbCommand("insert into Data1 values (@name, @age)", oleConnection))
{
addItem.Parameters.AddWithValue("@name", t.Item1);
addItem.Parameters.AddWithValue("@age", t.Item2);
addItem.ExecuteNonQuery();
}
}
}
}
}
}
答案 1 :(得分:0)
我遇到了同样的问题,插入的字段会得到一个领先的单引号。我发现这只是使用JET 4.0库时的情况,当我切换到ACE 12.0库时,问题就解决了。