用C#写的存储过程用于登录校验及写入登录信息用。
单独测试是可以得到userId的,但用程序调用userId始终为-1,即oID始终为null且Insert登录信息操作未执行。
不知是什么原因?另外,哪里有C#写存储过程的高级例子,很想学习学习。
[SqlProcedure]
public static void Login(string userName, string password, int loginMode, out int userId)
{
userId = -1;
SqlConnection conn = new SqlConnection("context connection=true");
string strSql = string.Format("SELECT ID FROM Users WHERE Name = '{0}' AND Password = '{1}'", userName, password);
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.CommandText = strSql;
sqlCmd.Connection = conn;
conn.Open();
object oID = sqlCmd.ExecuteScalar();
conn.Close();
if (oID != null)
{
userId = (int)oID;
strSql = string.Format("INSERT INTO UserLogin (UserID, Mode) Values({0}, {1})", userId, loginMode);
sqlCmd.CommandText = strSql;
conn.Open();
sqlCmd.ExecuteNonQuery();
}
if (conn.State == ConnectionState.Open) conn.Close();
}
单独测试是可以得到userId的,但用程序调用userId始终为-1,即oID始终为null且Insert登录信息操作未执行。
不知是什么原因?另外,哪里有C#写存储过程的高级例子,很想学习学习。
[SqlProcedure]
public static void Login(string userName, string password, int loginMode, out int userId)
{
userId = -1;
SqlConnection conn = new SqlConnection("context connection=true");
string strSql = string.Format("SELECT ID FROM Users WHERE Name = '{0}' AND Password = '{1}'", userName, password);
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.CommandText = strSql;
sqlCmd.Connection = conn;
conn.Open();
object oID = sqlCmd.ExecuteScalar();
conn.Close();
if (oID != null)
{
userId = (int)oID;
strSql = string.Format("INSERT INTO UserLogin (UserID, Mode) Values({0}, {1})", userId, loginMode);
sqlCmd.CommandText = strSql;
conn.Open();
sqlCmd.ExecuteNonQuery();
}
if (conn.State == ConnectionState.Open) conn.Close();
}
解决方案 »
- c# 自定义组件属性设置的问题 求解
- 关于treeView1,绑写数据库,成为树形结构
- c#怎样调用打印机控制命令?
- 有已经写好的一个xml形式的wsdl文件,里面方法也写好了,怎么把这个文件跟后台CS文件连接起来,并实现方法,可以部署到IIS呢。
- 学习堆栈遇到的一个问题 100分献上
- 我用C#2005编的程序在别人机器上不能运行
- 如何把两个excel文件合并成一个新的excel文件,并保持每个Cell的style一样
- ???网页截图快照出现边框是哪里的原因???
- 微博SDK 帐号登录问题
- 接口定义问题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
- C#中,[STAThread]代表什么意思?
- 邀请高手讨论:怎样使用studio.net制作C#安装程序到非dotNet环境
里面要有RETURN 的语句才能有返回值。给你一个抓参数的真正例子: LocalDBConn cnn = new WSC.Common.LocalDBConn();
SqlParameter[] paras = new SqlParameter[1];
SqlParameter para = new SqlParameter("@path", System.Data.SqlDbType.NVarChar, 1000);
para.Direction = ParameterDirection.Output;
paras[0] = para;
SqlCommand cmd = cnn.CreateStoreProcedureCommand("GetWebPath", paras);
cmd.ExecuteNonQuery(); string strPath = cmd.Parameters["@Path"].Value.ToString(); //这里才抓OUT参数
关于调用存储过程就是类似你的写法,但out参数始终是-1.
http://blog.csdn.net/knight94/archive/2006/03/23/635885.aspx这里面的存储以及存储调用
http://blog.csdn.net/zhzuo/archive/2004/10/28/156647.aspx
/// 存储过程执行函数
/// </summary>
/// <param name="strSpName">存储过程名</param>
/// <param name="ht">参数信息集</param>
/// <param name="strParameterArray">需返回的参数名数组</param>
/// <returns>存有返回值的HashTable</returns>
public void ExecStoredProcedure(string strSpName,Hashtable ht,string[] strParameterArray)
{
SqlCommand comm = new SqlCommand(strSpName,Conn);
comm.CommandType = CommandType.StoredProcedure; IDictionaryEnumerator htEnumerator = ht.GetEnumerator();
while (htEnumerator.MoveNext())
comm.Parameters.Add(htEnumerator.Key.ToString(),htEnumerator.Value); foreach (string strParameterName in strParameterArray)
comm.Parameters[strParameterName].Direction = ParameterDirection.Output; try
{
OpenConn();
comm.ExecuteNonQuery();
}
finally
{
CloseConn();
}
ht.Clear();
foreach (string strParameterName in strParameterArray)
ht.Add(strParameterName,comm.Parameters[strParameterName].Value);
} /// <summary>
/// 存储过程执行函数
/// </summary>
/// <param name="strSpName">存储过程名</param>
/// <param name="ht">参数信息集</param>
public void ExecStoredProcedure(string strSpName,Hashtable ht)
{
SqlCommand comm = new SqlCommand(strSpName,Conn);
comm.CommandType = CommandType.StoredProcedure; IDictionaryEnumerator htEnumerator = ht.GetEnumerator();
while (htEnumerator.MoveNext())
comm.Parameters.Add(htEnumerator.Key.ToString(),htEnumerator.Value); try
{
OpenConn();
comm.ExecuteNonQuery();
}
finally
{
CloseConn();
}
} Hashtable ht = new Hashtable();
ht.Add("@variable_1","参数1");
ht.Add("@variable_2","参数2");
ht.Add("@variable_3","参数3");
//带返回数据
string[] variableList = {"@variable_2","@variable_3"};
ExecStoredProcedure("存储过程名",Hashtable ht,variableList);
//返回数据在Hashtable ht相对应的键中 //不带返回数据
ExecStoredProcedure("存储过程名",Hashtable ht); //ExecStoredProcedure方法是一个2次重载的方法
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;public partial class StoredProcedures {
[Microsoft.SqlServer.Server.SqlProcedure()]
public static void SampleSP(string connstring, out int spid) {
using (SqlConnection conn = new SqlConnection(connstring)) {
conn.Open(); SqlCommand cmd = new SqlCommand("SELECT @@SPID", conn);
spid = (int)cmd.ExecuteScalar();
}
}
}
--注意这里,out int spid,代表输出参数
http://blog.csdn.net/zhzuo/archive/2004/10/28/156647.aspx
参考