如何在c#中使用oledb执行pl sql块

Posted

技术标签:

【中文标题】如何在c#中使用oledb执行pl sql块【英文标题】:How to execute pl sql block using oledb in c# 【发布时间】:2014-08-16 07:58:55 【问题描述】:

我正在使用 C# 中的 OLEDB 执行 Pl/Sql 块。 代码是:

        string a1;
        a1 = discom1.Text.ToString();

        my_querry10 = "BEGIN"+
                      "SELECT * from MasterCompliant WHERE Discom ='" + a1 + "';"+
                      "" + var1 + " = SQL%ROWCOUNT;"+
                      "END;";
        OleDbCommand cmd12 = new OleDbCommand(my_querry10, conn);
        conn.Open();

        cmd12.ExecuteNonQuery();

异常即将声明:

“cmd12.ExecuteNonQuery”为 “无效的 SQL 语句;应为 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT' 或 'UPDATE'。”

MasterCompliant 是表名; Discom 是列名,var1 是整数。

【问题讨论】:

你的字符串以BEGINSTART 开头——这不是一个很好的起点。您还将参数直接放入 SQL 字符串中,这是一个非常糟糕的主意。请改用参数化 SQL。你真的需要执行一个块而不是一个命令吗?目前尚不清楚您要在这里实现什么。 我的任务是:我正在从 Discom 列名中搜索字符串 'a1' 并尝试使用 SQL&ROWCOUNT 以整数 'var1' 检索其计数.. 即使您更正了语法错误,此块也不会按预期工作。您正在执行一个SELECT 语句,您应该在其中打开一个游标。此外,您试图从 PL/SQL 块内部将 SQL%ROWCOUNT 分配给 C# 变量 var1 - 这将不起作用,因为 PL/SQL 不知道您的 C#(或 VB 或其他)变量。 (并且 - 使用赋值运算符:=)。请查看this question,它显示了如何从匿名块中获取值。祝你好运。 【参考方案1】:

在我看来,您根本不需要单独的块 - 您可以使用 SELECT COUNT(1)ExecuteScalar

string sql = "SELECT COUNT(1) FROM MasterCompliant WHERE Discom = ?";
int count;

// Open and close a connection each time you need one - let the connection pool
// handle making that efficient.
using (var connection = new OleDbConnection(...))

    connection.Open();
    using (var command = new OleDbCommand(sql, conn))
    
        command.Parameters.Add("@v", OleDbType.VarChar).Value = discom1.Text;
        count = (int) command.ExecuteScalar();
    

您可能需要转换为 long 而不是 int - 您基本上应该尝试一下。

注意使用参数化查询如何使 SQL 更易于阅读防止SQL Injection attacks。

【讨论】:

【参考方案2】:

去掉a1附近的分号

Discom ='" + a1 + "';"+Discom ='" + a1 + "'"+

"BEGIN"+
"SELECT * from MasterCompliant WHERE Discom ='" + a1 + "'"+
"" + var1 + " = SQL%ROWCOUNT;"+
"END;"

【讨论】:

它不起作用..即使删除分号后也会出现类似的异常。

以上是关于如何在c#中使用oledb执行pl sql块的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PL/SQL 块 (IF/THEN) 中执行“插入...选择...

如何在 C# 中使用 OleDB 列出 MS Access 文件中的所有查询?

PL/SQL 块需要大量时间来执行

如何使用绑定变量使整个 PL/SQL 代码块动态化?

如何在纯 C# 中使用 PL/SQL?

在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)