我正在开发一个允许用户选择 MS Access 表然后将其导出到特定目的地的 .csv 文件的程序。问题是当所选表包含 sql 特殊字符时出现错误。
我已经对该主题进行了一些研究,我知道我需要使用参数,但我不知道如何实际使用。这是我的代码示例:
string destination = Form2.destination;
string selectString = "SELECT * FROM " + tablename;
string path = destination + "\\" + tablename + ".csv";
File.Create(path).Dispose();
TextWriter tw = new StreamWriter(path);
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + txtDataPath.Text);
connection.Open();
DataSet myDataSet = new DataSet();
OleDbCommand command = new OleDbCommand(selectString,connection);
OleDbDataAdapter adapter = new OleDbDataAdapter(command.CommandText,connection);
adapter.Fill(myDataSet, tablename);
到目前为止,如果选择了一个没有特殊字符的表名,则会创建 csv 文件并且看起来不错,但如果它包含类似“-”的内容,那么我的程序会在 FROM 中产生“语法错误”子句”,这是因为它的特殊性。
到目前为止,我所看到的所有示例都与我正在尝试做的具体工作不符,我想希望有人能帮助我。谢谢。
最佳答案
您的实际查询不需要参数,因为它们可用于为 WHERE 条件或 INSERT/UPDATE 语句提供值,但不能替换表名或列名。
但是如果表名包含特殊字符(例如空格),它本身就有问题
为避免此问题,请将表名括在方括号中
string selectString = "SELECT * FROM [" + tablename + "]";
请记住,以这种方式连接字符串是非常危险的。如果 tablename 变量来自未正确检查的用户输入,您将面临 Sql Injection Attack 的风险.
也不要使用字符串连接来构建你的路径,有一个非常方便的类可以做到这一点
string path = Path.Combine(destination, tablename + ".csv");
最后,尝试使用 Using Statement封闭你的连接和其他一次性对象,因为它确保正确关闭和处理这些对象,否则可能会成为程序稳定性的问题
using(OleDbConnection connection = new OleDbConnection("........"))
using(OleDbCommand command = new OleDbCommand(selectString,connection))
using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
connection.Open();
DataSet myDataSet = new DataSet();
adapter.Fill(myDataSet, tablename);
}
关于c# - 转义sql中的特殊字符,c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16743265/