散分啦!大侠们,C#执行存储过程的问题!!!

xBoady 2012-06-12 03:45:57
/// <summary>
/// 增加一条数据
/// </summary>
public bool AddBargain(BG_Bargain model)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("INSERT INTO BG_Bargain(");
strSql.Append("BGID,BG_Type,BG_State,BG_GS_State,BG_YC_State,BG_HD_State,BG_HK_State,BG_CK_State,BG_OP_Time,BG_SNode,BG_SName,BG_TNode,BG_TName,BG_Etype,BG_YEType,BG_BCard,BG_GCode,BG_SD_Linker,BG_SD_LkCode,BG_RC_Linker,BG_RC_LkCode,BG_RC_Addr,BG_BMode,BG_Number,BG_Remain,BG_Weight,BG_Volume,BG_Freight,BG_FT_Name,BG_FT_Pack,BG_FT_RMoney,BG_ICharge,BG_FCharge,BG_DCharge,BG_Payment,BG_RPayment,BG_OP_Code,BG_OP_Name,BG_Remark,BG_GCharge,BG_ZEtype,BG_HD)");
strSql.Append(" VALUES (");
strSql.Append("@BGID,@BG_Type,@BG_State,@BG_GS_State,@BG_YC_State,@BG_HD_State,@BG_HK_State,@BG_CK_State,@BG_OP_Time,@BG_SNode,@BG_SName,@BG_TNode,@BG_TName,@BG_Etype,@BG_YEType,@BG_BCard,@BG_GCode,@BG_SD_Linker,@BG_SD_LkCode,@BG_RC_Linker,@BG_RC_LkCode,@BG_RC_Addr,@BG_BMode,@BG_Number,@BG_Remain,@BG_Weight,@BG_Volume,@BG_Freight,@BG_FT_Name,@BG_FT_Pack,@BG_FT_RMoney,@BG_ICharge,@BG_FCharge,@BG_DCharge,@BG_Payment,@BG_RPayment,@BG_OP_Code,@BG_OP_Name,@BG_Remark,@BG_GCharge,@BG_ZEtype,@BG_HD)");
SqlParameter[] parameters = {
new SqlParameter("@BGID", SqlDbType.Char,16),
new SqlParameter("@BG_Type", SqlDbType.Int,4),
new SqlParameter("@BG_State", SqlDbType.Int,4),
new SqlParameter("@BG_GS_State", SqlDbType.Int,4),
new SqlParameter("@BG_YC_State", SqlDbType.Int,4),
new SqlParameter("@BG_HD_State", SqlDbType.Int,4),
new SqlParameter("@BG_HK_State", SqlDbType.Int,4),
new SqlParameter("@BG_CK_State", SqlDbType.Int,4),
new SqlParameter("@BG_OP_Time", SqlDbType.DateTime),
new SqlParameter("@BG_SNode", SqlDbType.VarChar,16),
new SqlParameter("@BG_SName", SqlDbType.VarChar,32),
new SqlParameter("@BG_TNode", SqlDbType.VarChar,16),
new SqlParameter("@BG_TName", SqlDbType.VarChar,32),
new SqlParameter("@BG_Etype", SqlDbType.VarChar,16),
new SqlParameter("@BG_YEType", SqlDbType.VarChar,16),
new SqlParameter("@BG_BCard", SqlDbType.VarChar,16),
new SqlParameter("@BG_GCode", SqlDbType.VarChar,16),
new SqlParameter("@BG_SD_Linker", SqlDbType.VarChar,32),
new SqlParameter("@BG_SD_LkCode", SqlDbType.VarChar,32),
new SqlParameter("@BG_RC_Linker", SqlDbType.VarChar,32),
new SqlParameter("@BG_RC_LkCode", SqlDbType.VarChar,32),
new SqlParameter("@BG_RC_Addr", SqlDbType.VarChar,128),
new SqlParameter("@BG_BMode", SqlDbType.Int,4),
new SqlParameter("@BG_Number", SqlDbType.Int,4),
new SqlParameter("@BG_Remain", SqlDbType.Int,4),
new SqlParameter("@BG_Weight", SqlDbType.Float,8),
new SqlParameter("@BG_Volume", SqlDbType.Float,8),
new SqlParameter("@BG_Freight", SqlDbType.Float,8),
new SqlParameter("@BG_FT_Name", SqlDbType.VarChar,64),
new SqlParameter("@BG_FT_Pack", SqlDbType.VarChar,64),
new SqlParameter("@BG_FT_RMoney", SqlDbType.Float,8),
new SqlParameter("@BG_ICharge", SqlDbType.Float,8),
new SqlParameter("@BG_FCharge", SqlDbType.Float,8),
new SqlParameter("@BG_DCharge", SqlDbType.Float,8),
new SqlParameter("@BG_Payment", SqlDbType.Float,8),
new SqlParameter("@BG_RPayment", SqlDbType.Float,8),
new SqlParameter("@BG_OP_Code", SqlDbType.Int,4),
new SqlParameter("@BG_OP_Name", SqlDbType.VarChar,16),
new SqlParameter("@BG_Remark", SqlDbType.VarChar,128),
new SqlParameter("@BG_GCharge", SqlDbType.Float,8),
new SqlParameter("@BG_ZEtype", SqlDbType.VarChar,16),
new SqlParameter("@BG_HD", SqlDbType.Int,4)};
parameters[0].Value = model.BGID;
parameters[1].Value = 1;
parameters[2].Value = model.BG_State;
parameters[3].Value = 0;
parameters[4].Value = 0;
parameters[5].Value = 0;
parameters[6].Value = 0;
parameters[7].Value = 0;
parameters[8].Value = Convert.ToDateTime("2012-02-01");
parameters[9].Value = model.BG_SNode;
parameters[10].Value = model.BG_SName;
parameters[11].Value = model.BG_TNode;
parameters[12].Value = model.BG_TName;
parameters[13].Value = model.BG_Etype;
parameters[14].Value = model.BG_YEType;
parameters[15].Value = model.BG_BCard;
parameters[16].Value = model.BG_GCode;
parameters[17].Value = model.BG_SD_Linker;
parameters[18].Value = model.BG_SD_LkCode;
parameters[19].Value = model.BG_RC_Linker;
parameters[20].Value = model.BG_RC_LkCode;
parameters[21].Value = model.BG_RC_Addr;
parameters[22].Value = model.BG_BMode;
parameters[23].Value = model.BG_Number;
parameters[24].Value = model.BG_Remain;
parameters[25].Value = model.BG_Weight;
parameters[26].Value = model.BG_Volume;
parameters[27].Value = model.BG_Freight;
parameters[28].Value = model.BG_FT_Name;
parameters[29].Value = model.BG_FT_Pack;
parameters[30].Value = model.BG_FT_RMoney;
parameters[31].Value = model.BG_ICharge;
parameters[32].Value = model.BG_FCharge;
parameters[33].Value = model.BG_DCharge;
parameters[34].Value = model.BG_Payment;
parameters[35].Value = model.BG_RPayment;
parameters[36].Value = model.BG_OP_Code;
parameters[37].Value = model.BG_OP_Name;
parameters[38].Value = model.BG_Remark;
parameters[39].Value = model.BG_GCharge;
parameters[40].Value = model.BG_ZEtype;
parameters[41].Value = model.BG_HD;

DBHelper db = new DBHelper();
int rows = db.eProductCommand(strSql.ToString(), parameters,CommandType.Text);
if (rows > 0)
{
return true;
}
else
{
return false;
}
}

上面是我的Dal方法。
下面是DBHelper,

public int eProductCommand(string proName, SqlParameter[] para, CommandType commType)
{
scom = new SqlCommand(proName, scon);
scom.CommandType = commType;
scom.Parameters.AddRange(para);

try
{
int result = Int32.Parse(scom.ExecuteNonQuery().ToString());
scon.Close();
return result;
}
catch (Exception)
{
return 0;
}
}

找了N久没找出问题,不知道哪里错了,靠。高手求救。。。。。。。在线等。。。

...全文
347 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
码农-彬少 2012-06-13
  • 打赏
  • 举报
回复
你傻啊~
直接拿个代码生成器,还用自己写吗~
104915562 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
报下面的错误信息:

参数化查询 '(@BGID char(16),@BG_Type int,@BG_State int,@BG_GS_State int,@BG_' 需要参数 @BG_YEType,但未提供该参数
这个参数明明有,为啥还报?
[/Quote]
明明没有这个参数,你说有
@BG_Type和@BG_YEType一样吗?
maqh813 2012-06-13
  • 打赏
  • 举报
回复
就来看看评论~!
  • 打赏
  • 举报
回复
你这是神一样的存储过程吧。
XD_Studio 2012-06-12
  • 打赏
  • 举报
回复
将插入记录,执行sql语句,构造sql语句的方法都分开要好一些吧。
例如:
/// <summary>
/// 向数据表中插入一条记录
/// </summary>
/// <param name="tableName">数据表名</param>
/// <param name="fieldsWithValue">Dictionary(字段名,字段值)</param>
public void InsertRecord(string tableName, Dictionary<string, object> fieldsWithValue)
{
try
{
List<string> fieldNames = fieldsWithValue.Keys.ToList<string>();
string sql = BuildInsertRecordString(tableName, fieldNames);
SqlParameter[] parameters = new SqlParameter[fieldNames.Count];
for (int i = 0; i < fieldNames.Count; i++)
{
parameters[i] = new SqlParameter(String.Format("@{0}", i), fieldsWithValue[fieldNames[i]]);
}
_comm.Transaction = _trans;
_comm.CommandText = sql;
_comm.Parameters.AddRange(parameters);
_comm.ExecuteNonQuery();
_comm.Parameters.Clear();
}
catch
{
throw;
}
}

/// <summary>
/// 构造向数据表中添加记录的SQL语句
/// </summary>
/// <param name="tableName">数据表名</param>
/// <param name="fieldNames">字段名列表</param>
/// <returns>sql语句</returns>
public string BuildInsertRecordString(string tableName, List<string> fieldNames)
{
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.AppendFormat("insert into \"{0}\"(",tableName.ToLower());

//添加字段名
for (int i = 0; i < fieldNames.Count; i++)
{
sqlBuilder.AppendFormat("\"{0}\",", fieldNames[i].ToLower());
}
//去掉最后一个逗号
sqlBuilder.Remove(sqlBuilder.Length - 1, 1);

sqlBuilder.Append(") values(");

//添加字段值
for (int i = 0; i < fieldNames.Count; i++)
{
//sqlBuilder.AppendFormat("@{0},", fieldNames[i]);
sqlBuilder.AppendFormat("@{0},", i);
}
//去掉最后一个逗号
sqlBuilder.Remove(sqlBuilder.Length - 1, 1);
sqlBuilder.Append(");");

return sqlBuilder.ToString();
}

这样的话,插入记录的时候只需要给出数据表名,还有字段名、字段值就可以了,也不用关心字段值的数据类型如何。
xBoady 2012-06-12
  • 打赏
  • 举报
回复

哪位大侠有实例呀,sql创建存储过程、执行多条sql(update,insert),包含事物回滚之类的。。。
寂小寞 2012-06-12
  • 打赏
  • 举报
回复
是sql语句的问题 你把有具体参数的语句写到数据库的studio里执行 能添加数据再往程序里写 再说了 存储工程怎么到dal里了
牛哥_ 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

引用 11 楼 的回复:
int result = Int32.Parse(scom.ExecuteNonQuery().ToString());
这一句根本就没有必要,直接
int result = scom.ExecuteNonQuery();

你要看看捕获的异常信息是什么才能判断出了什么问题,这样别人才能帮你,再好的医生碰到不说话的病人也治不好他的病


参数化查询 '……
[/Quote]

说明你哪里没有用到 这个参数啊 自己好好看看 写的真……乱
[Quote=引用 1 楼 的回复:]

靠,也不说什么错,而且有这么干的吗,你存储过程为什么不写到数据库中
[/Quote]
哈哈 大神也没辙了 太乱了
EnForGrass 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

搞定了,原来在传参数的时候不能为null值,靠,神马的东东呀。。。。

其实这只是我实现的主要功能的第一步而已,我的目的是想通过一个存储过程执行多条存储过程。包括事物,

刚刚只是在.net平台调用测试。

哪位大侠有那种实例呀,sql创建存储过程、执行多条sql(update,insert)

有的话直接散发。。。谢谢啦
[/Quote]
晕倒,看我7楼的代码。要存储过程里可以写多条sql语句
北极小猪 2012-06-12
  • 打赏
  • 举报
回复
这样写以后改起来累死了。。。。
xBoady 2012-06-12
  • 打赏
  • 举报
回复
搞定了,原来在传参数的时候不能为null值,靠,神马的东东呀。。。。

其实这只是我实现的主要功能的第一步而已,我的目的是想通过一个存储过程执行多条存储过程。包括事物,

刚刚只是在.net平台调用测试。

哪位大侠有那种实例呀,sql创建存储过程、执行多条sql(update,insert)

有的话直接散发。。。谢谢啦
xBoady 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
int result = Int32.Parse(scom.ExecuteNonQuery().ToString());
这一句根本就没有必要,直接
int result = scom.ExecuteNonQuery();

你要看看捕获的异常信息是什么才能判断出了什么问题,这样别人才能帮你,再好的医生碰到不说话的病人也治不好他的病
[/Quote]

参数化查询 '(@BGID char(16),@BG_Type int,@BG_State int,@BG_GS_State int,@BG_' 需要参数 @BG_YEType,但未提供该参数
这个参数明明有,为啥还报?
  • 打赏
  • 举报
回复
我想 高手们也没办法帮你了!
xBoady 2012-06-12
  • 打赏
  • 举报
回复
报下面的错误信息:

参数化查询 '(@BGID char(16),@BG_Type int,@BG_State int,@BG_GS_State int,@BG_' 需要参数 @BG_YEType,但未提供该参数
这个参数明明有,为啥还报?
__天涯寻梦 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 9 楼 xiaolongit 的回复:

本来100多列,被我干掉了60列。。。按道理这样写也没啥问题呀。高手们看出问题所在没?

存储过程不像是存储过程,变量名也乱取
scom.CommandType = commType;
改成
scom.CommandText = commType;
[/Quote]
int rows = db.eProductCommand(strSql.ToString(), parameters,CommandType.Text);
mathieuxiao 2012-06-12
  • 打赏
  • 举报
回复
int result = Int32.Parse(scom.ExecuteNonQuery().ToString());
这一句根本就没有必要,直接
int result = scom.ExecuteNonQuery();

你要看看捕获的异常信息是什么才能判断出了什么问题,这样别人才能帮你,再好的医生碰到不说话的病人也治不好他的病
EnForGrass 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaolongit 的回复:]

本来100多列,被我干掉了60列。。。按道理这样写也没啥问题呀。高手们看出问题所在没?
[/Quote]
存储过程不像是存储过程,变量名也乱取
scom.CommandType = commType;
改成
scom.CommandText = commType;
xBoady 2012-06-12
  • 打赏
  • 举报
回复
本来100多列,被我干掉了60列。。。按道理这样写也没啥问题呀。高手们看出问题所在没?
__天涯寻梦 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 1 楼 的回复:
靠,也不说什么错,而且有这么干的吗,你存储过程为什么不写到数据库中

int result = Int32.Parse(scom.ExecuteNonQuery().ToString());执行这条语句的时候报异常信息。。。
[/Quote]
这就不关存储过程的事,存储过程一样得这么写,不过这语句够长的,异常的内容是什么? Float 一般是4字节长度,你写的8,换成4试试呢
EnForGrass 2012-06-12
  • 打赏
  • 举报
回复
晕倒,这么写代码你不觉得累嘛?参数如此之多
存储过程 sql

--用于用户注册
CREATE PROCEDURE pd_UserRegister
(
@Name nvarchar(20),
@Nick nvarchar(20),
@Pass nvarchar(20),
@Email nvarchar(50),
@Mark nvarchar(500)
)
AS
INSERT INTO UserInfor(userName,userNick,userPass,userEmail,userMark,userGroup,userLevel) VALUES(@Name,@Nick,@Pass,@Email,@Mark,1,1)
IF(@@RowCount<1)
RETURN 0
ELSE
RETURN 1


C#代码调用存储过程

//注册
public int UserRegister(string[] regester)
{
//获得数据库连接对象
SqlConnection conn = new SqlConnection(DBConn);
//创建数据库命令
SqlCommand cmd = conn.CreateCommand();
//使用pd_UserRegister存储过程
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "pd_UserRegister";
//设置注册用户默认组为1---用户
//数据库中有默认的用户组0---管理员
//将注册用户信息作为参数传入
cmd.Parameters.AddWithValue("@Name", regester[0].Trim());
cmd.Parameters.AddWithValue("@Nick", regester[1].Trim());
cmd.Parameters.AddWithValue("@Pass", regester[2].Trim());
cmd.Parameters.AddWithValue("@Email", regester[3].Trim());
cmd.Parameters.AddWithValue("@Mark", regester[4].Trim());

SqlParameter parreturn = cmd.Parameters.Add("returnvalue", SqlDbType.Int);
parreturn.Direction = ParameterDirection.ReturnValue;
//打开数据库连接
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
int state;
try
{
//执行插入用户信息
cmd.ExecuteNonQuery();
state = Convert.ToInt32(cmd.Parameters["returnvalue"].Value);
}
catch (System.Exception ex)
{
state = 0;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
return state;
}
加载更多回复(6)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧