本文包括用SqlClient和Odbc两种连接方式调用SqlServer的存储过程,这两种方式有细微的区别:
存储过程名为‘MaxAge’,包括输入参数和输出参数,输出只能人员的最大年龄。数据库为自建的test数据库,包括一个名为useName的表,字段有id(itn);name(nvarchar(10));age(int)
存储过程如下:
Code
if Exists(select name from sysobjects where type='p' and name='MaxAge')
drop proc MaxAge
go
create proc MaxAge
(@Name1 nvarchar(10),
@Name2 nVarchar(10),
@MaxAge int output)
as
select @MaxAge=Max(age) from dbo.UserName where name=@Name1 or name=@Name2
使用SqlClient调用存储过程的方法如下:
Code
SqlConnection con = new SqlConnection("server=PC-200201070359;uid=sa;pwd=123;database=test;");
try
{
con.Open();
SqlCommand command = new SqlCommand();
command.Connection = con;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "MaxAge"; //存储过程名称
//输入参数
SqlParameter para = new SqlParameter("@Name1", "James");
command.Parameters.Add(para);
//输入参数
para = new SqlParameter("@Name2", "Mary");
command.Parameters.Add(para);
//输出参数(参数名称大小写无关)
para = new SqlParameter("@Maxage", SqlDbType.Int, 4);
para.Direction = ParameterDirection.Output;
command.Parameters.Add(para);
int i = command.ExecuteNonQuery(); //执行成功返回-1
string k = command.Parameters["@Maxage"].Value.ToString();
}
catch (Exception ex)
{
//throw;
}
使用Odbc调用存储过程的方法如下:
Code
OdbcConnection con = new OdbcConnection("Driver={SQL Server};server=PC-200201070359;uid=sa;pwd=123;database=test;");
try
{
con.Open();
OdbcCommand command = new OdbcCommand();
command.Connection = con;
command.CommandType = CommandType.StoredProcedure;
//command.CommandText = "MaxAge"; //存储过程名称
command.CommandText = "{call MaxAge (?, ?,?)}";
//输入参数
OdbcParameter para = new OdbcParameter("@Name1", OdbcType.NVarChar, 10);
para.Value = "James";
command.Parameters.Add(para);
//输入参数
para = new OdbcParameter("@Name2", OdbcType.NVarChar, 10);
para.Value = "Mary";
command.Parameters.Add(para);
//输出参数(参数名称大小写无关)
para = new OdbcParameter("@MaxAge", OdbcType.Int, 4);
para.Direction = ParameterDirection.Output;
command.Parameters.Add(para);
int i = command.ExecuteNonQuery(); //执行成功返回-1
string k = command.Parameters["@Maxage"].Value.ToString();
}
catch (Exception ex)
{
//throw;
}
可能遇到的问题:
使用ODBC方法,只能方法时会报这样的异常:ERROR [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]过程 'MaxAge' 需要参数 '@Name1',但未提供该参数。
解决办法:将command.CommandText = "MaxAge"; //存储过程名称 改为 command.CommandText = "{call MaxAge (?, ?,?)}";即可,目前原因未知;前面的方法在sqlclient中是可用的