如何在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) 中执行“插入...选择...