c# - 转义sql中的特殊字符,c#

标签 c# database parameters special-characters

我正在开发一个允许用户选择 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/

相关文章:

c# - 如何让控件在窗口最大化时自行调整大小?

c# - 为什么我的 WebApi 收到响应状态代码 204 No Content?

mysql - 系名及学生人数

c++ - 参数在继承函数中消失

c# - 正则表达式/linq 用计数替换连续字符

c# - Entity Framework 7 内存数据库异常

mysql - 如何在 LEFT OUTER JOIN 上使用索引

php - 截断 double 值(php)

c# - 具有可变数量参数的 IronPython 函数作为委托(delegate)

java - 碧 Jade 报告 : Store in variable value of parameter bean property