i 整数的 cmd.ExecuteNonQuery 值从 0 变为 -1

Posted

技术标签:

【中文标题】i 整数的 cmd.ExecuteNonQuery 值从 0 变为 -1【英文标题】:cmd.ExecuteNonQuery value of i integer is going -1 from 0 【发布时间】:2012-07-23 20:20:52 【问题描述】:

在这里我动态地在数据库中创建表。 用户根据自己的意愿输入名称并选择语言单选按钮。 所以问题是在执行 cmd.ExecuteNonQuery 之后,我整数的值从 0 变为 -1。并显示该表无法创建,但是当我转到数据库时,它已经成功创建。请让我知道我在哪里做错了。提前谢谢!!

protected void btnpaper_Click(object sender, EventArgs e)
    
        try
                        
                string conn = ConfigurationManager.ConnectionStrings["sqlconn"].ConnectionString;
                SqlConnection con = new SqlConnection(conn);
                con.Open();
                char[] arr = new char[] 'n','g','l','i','s','h';
                string str = "CREATE TABLE " + Label1.Text.Trim() + 
                             txtpaperset.Text.Trim()+ rbtnEng.Text.TrimEnd(arr) +
                             "(" + "quesNo int NOT NULL PRIMARY KEY, " + 
                             "question varchar(1000) NOT NULL," + 
                             "ansA varchar(500) NOT NULL, " + 
                             "ansB varchar(500) NOT NULL, " + 
                             "ansC varchar(500) NOT NULL, " + 
                             "ansD varchar(500) NOT NULL, " + 
                             "rightAns varchar(50) NOT NULL " + ")";                    
                SqlCommand cmd = new SqlCommand(str, con);
                int i = cmd.ExecuteNonQuery();
                if (i > 0)
                
                    lblerrormsg.Visible = true;
                    con.Close();
                
                else
                
                    lblerrormsg.Text = "Table Not Created Please Try with Different Name!";                        
                    con.Close();
                                

        
        catch (System.Exception excep)
        
            MessageBox.Show(excep.Message);
              
    

【问题讨论】:

这是对 SQL 注入的邀请吗?使用 SQL 参数!除此之外,当你完成连接时,请务必关闭连接,最好使用using-statementusing(var con=new SqlConnection(conn))con.Open(); //...(它会隐式关闭连接,即使出现异常也是如此)。 @TimSchmelter:我不确定参数化 SQL 是否适用于 DDL... 【参考方案1】:

取自 MSDN Remarks on SqlCommand.ExecuteNonQuery

对于 UPDATE、INSERT 和 DELETE 语句,返回值为 受命令影响的行数。当触发器存在于 正在插入或更新的表,返回值包括数字 受插入或更新操作和数量影响的行数 受触发器或触发器影响的行数。对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回 值也是-1。

【讨论】:

【参考方案2】:

来自SqlCommand.ExecuteNonQuery 的文档(强调我的):

对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。当正在插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。 对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也是-1。

您的语句是 UPDATE、INSERT 还是 DELETE 语句?没有。因此你得到-1。

不清楚i 的值从 0 变为 -1 是什么意思。它永远不会是 0。它没有 值,直到它从结果中分配一个ExecuteNonQuery.

【讨论】:

我想让用户知道表创建是否成功。因此我使用了 i 整数。如果我可以使用其他方式,请提供帮助。 @rickevans:我希望如果表创建失败,你实际上会得到一个异常。试一试——看看如果你尝试重新创建一个已经存在的表会发生什么。【参考方案3】:

这是设计使然吗?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

还有:

cmd.executenonquery is returning -1 in vb.net windows application

你是说你得到-1,对吗?

编辑:要回答问题的最后一部分,请参阅:

Check if table exists in SQL Server

【讨论】:

我得到-1。我要做的就是通知用户表创建已成功完成。 创建一个额外的查询来验证它。 我的意思是,一旦您进行了创建,您就会得到 -1,然后您发出新查询以查看表是否真的存在。有道理?您只需进行第二次查询以查看第一个是否有效。【参考方案4】:

公共共享函数插入(ByVal SProcedure As String, ByVal parameters() As SqlParameter) As Boolean 使用 cnn 作为新的 SqlConnection(Emplooyes) 试试

            Dim cmd As SqlCommand = New SqlCommand(SProcedure, cnn)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.AddRange(parameters)

            If cnn.State = ConnectionState.Closed Then
                cnn.Open()
            End If

            Dim Ls As Integer
            Ls= cmd.ExecuteNonQuery()
            If Ls = -1 Then
                Return False
            Else
                Return True
            End If

        Catch ex As Exception
            Return False
        Finally
            cnn.Close()
        End Try
    End Using
End Function

【讨论】:

欢迎来到 Stack Overflow!您是否会考虑添加一些叙述来解释为什么此代码有效,以及是什么使它成为问题的答案?这对提出问题的人以及其他任何出现的人都非常有帮助。

以上是关于i 整数的 cmd.ExecuteNonQuery 值从 0 变为 -1的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 如何在后台判断Textbox输入的是整数

SqlCommand操作数据库

C#中怎么怎么获取插入的新纪录的自增的id号

asp.net 如何一次执行多条件Sql语句,如何解决?

使用 npgsql 在 c# 中插入

无法从表中显示最大工资(测试)