求助:用ExecuteNonQuery()方法执行INSERT语句插入成功后返回-1

bohao9603 2010-10-28 01:40:54
小弟新来的,手里没啥分,这就是我全部家当了- -

最近在做.AspNet开发的时候遇到一件怪事
主要是接手以前程序员做的Asp网站,进行暂时性的功能改善。

在对后台管理的一个表单传的值处理后,写入数据库发生了一下情况:
先贴下代码

public int NewInformation(Model.Zt_information zt_information)
{
StringBuilder sql = new StringBuilder();
sql.Append(" INSERT INTO zt_information(");
sql.Append(" z_class,z_title,z_content,z_content_j,z_source,z_keyword,z_author,z_picture,z_date,zixun_class,h_class,z_html_url)");
sql.Append(" VALUES( ");
sql.Append(" @z_class,@z_title,@z_content,@z_content_j,@z_source,@z_keyword,@z_author,@z_picture,@z_date,@zixun_class,@h_class,@z_html_url)");

SqlParameter[] parameters = {
new SqlParameter("@z_class", SqlDbType.Int),
new SqlParameter("@z_title", SqlDbType.NVarChar),
new SqlParameter("@z_content", SqlDbType.Text),
new SqlParameter("@z_content_j", SqlDbType.NVarChar),
new SqlParameter("@z_source", SqlDbType.NVarChar),
new SqlParameter("@z_keyword", SqlDbType.NVarChar),
new SqlParameter("@z_author", SqlDbType.NVarChar),
new SqlParameter("@z_picture", SqlDbType.NVarChar),
new SqlParameter("@z_date", SqlDbType.DateTime),
new SqlParameter("@zixun_class", SqlDbType.Int),
new SqlParameter("@h_class", SqlDbType.Int),
new SqlParameter("@z_html_url", SqlDbType.VarChar)};

zt_information.Z_html_url = "";

parameters[0].Value = zt_information.Z_class;
parameters[1].Value = zt_information.Z_title;
parameters[2].Value = zt_information.Z_content;
parameters[3].Value = zt_information.Z_content_j;
parameters[4].Value = zt_information.Z_source;
parameters[5].Value = zt_information.Z_keyword;
parameters[6].Value = zt_information.Z_author;
parameters[7].Value = zt_information.Z_picture;
parameters[8].Value = zt_information.Z_date;
parameters[9].Value = zt_information.Zixun_class;
parameters[10].Value = zt_information.H_class;
parameters[11].Value = zt_information.Z_html_url;

int i = DAL.Query.SafenoSearch(sql.ToString(), parameters);

return i;

}

DAL.QUERY.SafenoSearch()方法:

public static int SafenoSearch(string sql,SqlParameter[] prams)
{
int i = 0;
try
{
DbHelper.CloseConn();
DbHelper.OpenConn();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = sql;
cmd.Connection = DbHelper.conn;
foreach (SqlParameter par in prams)
{
cmd.Parameters.Add(par);
}
i = cmd.ExecuteNonQuery();
}
finally
{
DbHelper.CloseConn();
}
return i;
}


这段代码执行后有时候返回正常的1,有时候却返回-1,但是数据确确实实添加到数据库了。
并且如果出现返回-1的时候,程序立即执行
SELECT TOP 1
i.id,ic.z_name
FROM zt_information AS i
LEFT JOIN zt_information_class AS ic ON i.z_class=ic.id
ORDER BY i.id DESC
这个SQL语句居然什么东西都查不出来,会在da.Fill(ds)(SqlDataAdapter填充DataSet结果集)这里抛异常。提示好像是表Table没有任何数据


这就奇怪了啊,按理说上面那句T-SQL应该是只要zt_information表中有至少一条数据就绝对能查出来东西的,为什么会出现这种情况?
该如何解决?

因为我的机器装不上IIS,所以只能在服务器端测试,没法在本地下断点。
现在可以肯定的是,表单传进来的数据都没有问题,是否成功和表单传的内容无关,是某一时间段不好,某一时间段好用

顺便说下环境:
开发工具:Visual Studio 2008
数据库:SQLServer2005

在此先谢过各位了
...全文
589 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
renwoyou90 2011-07-25
  • 打赏
  • 举报
回复
bohao9603 2010-11-02
  • 打赏
  • 举报
回复
11楼提醒了我,优化了一下DbHelper,到现在没出现问题,可能是conn当时被我设成静态而出的问题吧
可以结贴了~
qiandongwu 2010-10-29
  • 打赏
  • 举报
回复
以前遇到过类似的问题,不过那是因为rd打开后没关闭,看你的connection也关闭了呀,不知道为啥
bohao9603 2010-10-29
  • 打赏
  • 举报
回复
沉了……求高手解答啊
bohao9603 2010-10-28
  • 打赏
  • 举报
回复
回7楼,8楼:

确定无疑是INSERT语句,我还没到SELECT语句用ExecuteNonQuery的地步。
并且我这段代码是用的SqlParameter,不存在被注入的可能。
再退一万步讲,就算是微软的SqlParameter有漏洞会被注入,那发信息的都是公司里的编辑,根本不懂啥Sql注入,而且我测试的时候是在旁边看着他们发的,不存在注入的情况
g_lbz 2010-10-28
  • 打赏
  • 举报
回复
有一种情况怀疑一下,楼主的这段代码非常容易被注入。有可能是被注入了查询语句,所以出现返回值是-1.建议通过SqlServer profiler监视一段时间,看看是否有被注入的可能。或者在返回值为-1时将参数记录下来,查看一下。
g_lbz 2010-10-28
  • 打赏
  • 举报
回复
ExecuteNonQuery()是update,delete ,insert影响行数,对于select永远返回-1
你的方法中是否引入的有查询语句
bohao9603 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lchy110 的回复:]

那你看看那你这个zt_information 表 上有没有触发器之类的
[/Quote]
早期程序员做的数据库,非常不规范,主键、约束、默认值、关系这些东西统统没有(对,你没看错,他确实连主键都没设),触发器这种东西肯定不会有的- -
lchy110 2010-10-28
  • 打赏
  • 举报
回复
那你看看那你这个zt_information 表 上有没有触发器之类的
bohao9603 2010-10-28
  • 打赏
  • 举报
回复
没有知道的吗?
bohao9603 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lchy110 的回复:]

既然有try 就加个catch
C# code

public static int SafenoSearch(string sql,SqlParameter[] prams)
{
int i = 0;
try
{
DbHelper.CloseConn();
……
[/Quote]
刚才把代码改了下传上去,不过暂时还没出问题,看不出来,等出问题后才知道结果,一阵一阵的。

不过既然能成功给i赋值,那说明try中的语句都执行完毕了,并没有出异常(因为给i赋值是最后一句……),再加上数据库也写入成功,在这里出异常的概率不大啊



[Quote=引用 2 楼 bossma 的回复:]

SqlCommand cmd = new SqlCommand();

cmd也需要Dispose
[/Quote]
cmd作为一个实例类,即使是垃圾回收机没处理也理应不会影响到别的东西啊,毕竟每次调用都会实例化一个
萤火架构 2010-10-28
  • 打赏
  • 举报
回复
SqlCommand cmd = new SqlCommand();

cmd也需要Dispose
lchy110 2010-10-28
  • 打赏
  • 举报
回复
既然有try 就加个catch

public static int SafenoSearch(string sql,SqlParameter[] prams)
{
int i = 0;
try
{
DbHelper.CloseConn();
DbHelper.OpenConn();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = sql;
cmd.Connection = DbHelper.conn;
foreach (SqlParameter par in prams)
{
cmd.Parameters.Add(par);
}
i = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
//在这个地方你可以将你的错误日志写到一个文件里去
string errMsg = "\r\n Class Name:" + this.ToString() + " \r\n Method Name: SafenoSearch (....) \r\n Return Type:int\r\n Error Description:" + ex;
}
finally
{
DbHelper.CloseConn();
}
return i;
}

//写个写错误日志的方法
public void WriteLog(string ExceptionMsg)
{
errorDescription = ExceptionMsg;
string FILE_NAME = ConfigurationManager.AppSettings["ExceptLog"];//此处为你webconfig里配置的文件保存路径
if (FILE_NAME == "") return;
DateTime nowdt;
nowdt = DateTime.Now;
if (File.Exists(FILE_NAME))
{
StreamWriter sr = File.AppendText(FILE_NAME);
sr.WriteLine(nowdt.ToString() + " | " + ExceptionMsg.ToString());
sr.Close();
}
else
{
StreamWriter sr = File.CreateText(FILE_NAME);
sr.WriteLine(nowdt.ToString() + " | " + ExceptionMsg.ToString());
sr.Close();
}
}


这样查看错误日志就很明了 自己在哪报异常 报什么异常

62,272

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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