c# - 在 C# 中执行 SQL 语句?

标签 c# sql execute

大家好,我想执行我的 SQL 语句,但我遇到了语法问题,有人可以帮我理解我做错了什么吗?

谢谢,阿什。

public void AddToDatabase(string[] WordArray, int Good, int Bad, int Remove)
{

    for (int WordCount = 0; WordCount < WordArray.Length; WordCount++)
    {
        string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (" + WordArray[WordCount] + ", " + Good + ", " + Bad + ", " + Remove + ")";

        Debug.Print(sSQL);

        //Private m_recordset As ADODB.Recordset
        //Private m_connection As ADODB.Connection
        ADODB.Recordset RS;
        ADODB.Connection CN ;


        CN = new ADODB.Connection();
        RS = new ADODB.Recordset();

        CN.CursorLocation = ADODB.CursorLocationEnum.adUseClient;

        CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=doom_calc_dict.mdb;jet OLEDB:database";
        CN.Open(CN.ConnectionString,"","",0);

        object dummy = Type.Missing;

        CN.Execute(sSQL,out dummy,0);

        RS.Close(); 
        CN.Close(); 

        //string sSQL = "SELECT Word FROM WordDef WHERE Word='" + WordArray[WordCount] + "'";
        DatabaseTools.LoadDataFromDatabase(sSQL);
        //DatabaseTools.LoadDataFromDatabase(sSQL);

    }
}

最佳答案

您需要修复的最重要的事情是使用查询参数而不是动态构建字符串。这将提高性能、维护和安全性。

此外,您还想使用更新的强类型 ADO.Net 对象。确保为 System.Data.OleDb 添加 using 指令.

注意 using此代码中的语句。当您完成连接时,他们将确保您的连接已关闭。这很重要,因为数据库连接是一种有限且不受管理的资源。

最后,您并没有真正在代码中使用数组。您真正关心的是迭代单词集合的能力,因此您想要接受 IEnumerable<string>。而不是数组。别担心:这个函数将接受一个数组作为参数,如果这是你需要传递给它的。

public void AddToDatabase(IEnumerable<string> Words, int Good, int Bad, int Remove)
{
    string sql = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (@Word, @Good, @Bad, @Remove)";

    using (OleDbConnection cn = new OleDbConnection("connection string here") )
    using (OleDbCommand cmd = new OleDbCommand(sql, cn))
    {
        cmd.Parameters.Add("@Word", OleDbType.VarChar);
        cmd.Parameters.Add("@Good", OleDbType.Integer).Value = Good;
        cmd.Parameters.Add("@Bad", OleDbType.Integer).Value = Bad;
        cmd.Parameters.Add("@Remove", OleDbType.Integer.Value = Remove;

        cn.Open();

        foreach (string word in Words)
        {
            cmd.Parameters[0].Value = word;
            cmd.ExecuteNonQuery();
        }
    }
}

还有一件事:在 OleDb 中使用查询参数时,确保按顺序添加它们很重要。

更新:固定在 VS 2005/.Net 2.0 上工作(依赖于 VS 2008 功能)。

关于c# - 在 C# 中执行 SQL 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/783294/

相关文章:

c# - 管理枚举字段

c# - 如何在不破坏应用程序引用的情况下从部署项目中重新定位程序集?

javascript - Chrome 扩展 - 如何执行具有按钮单击功能的 javascript 文件?

mysql - 将 EXECUTE 的查询结果存储在 View 中 - MySQL

c# - Blazor WebAssembly - 页面刷新时未调用 GetAuthenticationStateAsync()

c# - System.IdentityModel.Metadata 和 X509SecurityToken 在 ASP.NET Core 中不可用

mysql - MariaDB 将数据上传到表后创建不必要的临时文件

mysql - 哪个sql语句应该是正确的?

sql - bigquery 从日期中减去 3 个工作日

powershell - 将每个都有多个工作表的多个Excel工作簿转换为CSV:如何提取由公式构造的URL?