如何在ado.net中执行表值函数
本文关键字:执行 函数 net ado | 更新日期: 2023-09-27 17:54:28
我用的是ado.net。
我有一个函数jsp在我的数据库中,接受2个参数,并返回一个表。我需要提示用户输入这两个参数,然后执行jsp函数并将表打印到屏幕上。以下是我目前拥有的:
jspCmd = new SqlCommand(jspStmt, conn);
jspCmd.CommandType = CommandType.StoredProcedure;
jspCmd.Parameters.Add("@snum", SqlDbType.VarChar, 5);
jspCmd.Parameters.Add("@pnum", SqlDbType.VarChar, 5);
jspCmd.Prepare();
Console.WriteLine();
Console.WriteLine(@"Please enter S# and P# separated by blanks, or exit to terminate");
string line = Console.ReadLine();
Regex r = new Regex("[ ]+");
string[] fields = r.Split(line);
if (fields[0] == "exit") break;
jspCmd.Parameters[0].Value = fields[0];
jspCmd.Parameters[1].Value = fields[1];
jspCmd.ExecuteNonQuery();//<---I BELIEVE ERROR COMING FROM HERE
reader = jspCmd.ExecuteReader();//PRINT TABLE TO SCREEN
while (reader.Read())
{
Console.WriteLine(reader[0].ToString() + " "
+ reader[1].ToString()
+ " " + reader[2].ToString());
}
reader.Close();
当我运行这个时,我输入两个参数并引发一个异常:
Program aborted: System.Data.SqlClient.SqlException (0x80131904): The request
for procedure 'jsp' failed because 'jsp' is a table valued function object.
谁能告诉我做这件事的正确方法?
确保jspStmt是一个带有常规参数绑定的SELECT,例如:
var jspStmt = "SELECT * FROM myfunction(@snum, @pnum)";
// this is how table-valued functions are invoked normally in SQL.
省略以下内容:
jspCmd.CommandType = CommandType.StoredProcedure;
// WRONG TYPE, leave it as CommandType.Text;
省略以下内容:
jspCmd.ExecuteNonQuery();//<---I BELIEVE ERROR COMING FROM HERE
// WRONG KIND OF RESULT, it **IS** a query. Further, let your
// later jspCmd.ExecuteReader() invoke it and get the actual data.
要执行表值函数,使用SELECT
作为文本命令:
jspCmd = new SqlCommand("SELECT * FROM " + jspStmt + "()", conn);
jspCmd.CommandType = CommandType.Text;
和得到的结果使用ExecuteReader
-这是你已经做了,但后,你使用ExecuteNonQuery
,这是INSERT
s, UPDATE
s,等
添加到D Stanley的答案中,看起来您正在获得的新异常是由于错误调用函数造成的。尝试以下操作(更正了select语句并向函数中添加了参数):
jspCmd = new SqlCommand("SELECT * FROM jsp('" + fields[0] + "', '" + fields[1] + "')", conn);
然后继续使用ExecuteReader
像你做的。