在vs 2010中将varchar转换为数字时出错

时间:2014-01-17 14:44:07

标签: c# sql visual-studio-2010

错误显示“将数据类型varchar转换为数字时出错。”

这是我的一组代码:

    private void btnSearchCustomer_Click(object sender, EventArgs e)
    {
        //Get Customer Records
        DataSet dsCustomer = new DataSet();
        dsCustomer = GetRecords("Customers");

        frmBasicSearch newSearch = new frmBasicSearch();

        newSearch.myDataSet = dsCustomer;
        newSearch.ShowDialog();

        int myRowPosition = newSearch.myRowPosition;

        if (myRowPosition != -1) //will display the value inside the textboxes
        {
            //concuntinated values
            this.txtCustomerNo.Text = dsCustomer.Tables["Customers"].Rows[myRowPosition]["CustomerNo"].ToString();

            this.txtCustomerName.Text = dsCustomer.Tables["Customers"].Rows[myRowPosition]["CustomerName"].ToString();

            this.txtCustomerAddress.Text = dsCustomer.Tables["Customers"].Rows[myRowPosition]["CustomerAddress"].ToString();

            groupProduct(true); //this will activate the buttons from the Product Section
        }

        cn.Close();

        cn.Open();           

        SqlCommand cmdInsert = new SqlCommand();           

        cmdInsert.Connection = cn;
        cmdInsert.Transaction = trnOrder;
        cmdInsert.CommandType = CommandType.Text;
        cmdInsert.CommandText =
            "INSERT INTO ShoppingCart " +
            "(OrderDate, CustomerNo, CustomerName, CustomerAddress, PurchaseOrderNo, AgentNo, AgentName, InvoiceNo, TotalAmount, OrderStatus) " +
            "VALUES ('" +
            dtpOrderDate.Value.Date.ToString() + "', '" +
            txtCustomerNo.Text + "', '" +
            txtCustomerName.Text + "', '" +
            txtCustomerAddress.Text + "', '" +
            DBNull.Value + "', '" +
            DBNull.Value + "', '" +
            DBNull.Value + "', '" +
            DBNull.Value + "', '" +
            DBNull.Value + "', '" +
            "''Void'); " +
            "SELECT TOP 1 ShoppingCartNo FROM ShoppingCart " +
            "ORDER BY ShoppingCartNo DESC;";            

        cmdInsert.ExecuteNonQuery();

        cn.Close();                       
    }

突出显示的错误部分是

int nShoppingCart = Convert.ToInt16(cmdInsert.ExecuteScalar().ToString());

我似乎无法知道问题出在哪里?谢谢你的帮助

这是我的数据模式,

ShoppingCartNo在主键中,并且身份由1

自动判定

enter image description here

3 个答案:

答案 0 :(得分:1)

ExecuteScalar通常用于SQL部件返回某些行的情况。插入时请尝试使用ExecuteNonQuery

然后使用ExecuteScalar选择部分。应该工作。

为什么 -

现在,您有2个查询 - 当您在Management studio中运行2个查询时 - 您会得到'N行受影响'和&你的ShoppingCartNo。根据您当前的代码,仅返回第一部分(由于ExecuteScalar),这会导致类型转换错误。

答案 1 :(得分:1)

ExecuteScalar执行SELECT语句并返回firest返回行的第一列。对于INSERT语句,请使用ExecuteNonQuery。它将返回一个包含插入行数的整数,因此不需要转换,只需写入

即可
int nShoppingCart = cmdInsert.ExecuteNonQuery();

错误来自将字符串'NULL'插入数字列TotalAmount

"'" + DbNull.Value + "'"

将导致'NULL'(可能,我没有检查,但它肯定是一个字符串,而不是数值)。

您不需要将NULL值插入可以保存NULL值的列中。只需不要插入这些列,jjust插入包含数据的列。

之后,使用提到的SCOPE-IDENTITY()

使用ExecuteScalar执行查询

答案 2 :(得分:1)

首先:这不是检索自动递增密钥的正确方法。请改用SCOPE_IDENTITY(),或使用INSERT的OUTPUT子句。从多个角度来看,你的做法是不正确的:

  • 它返回错误的ID。插入两个线程,两者都选择相同的ID(最后一个)。
  • 如果重置IDENTITY,则返回错误的ID
  • 如果在INSERT和SELECT之间删除(仅)行,则它可以返回空结果集。

那么为什么不只使用SCOPE_IDENTITY()