日志含义将参数值从String类型转换为Int32类型失败

本文关键字:类型转换 Int32 类型 失败 String 参数 日志 | 更新日期: 2023-09-27 17:51:03

我使用MVC3和SQL 2005。我得到一个错误:"将数据类型varchar转换为数字错误。"我相信之所以生成这个,是因为我在QTYORDER中使用了"1"而不是"1.00000"。对QTYORDER使用"1.00000",我现在看到错误:"未能将参数值从字符串转换为Int32。"

我已经尝试使用Convert.ToInt32(变量)如下:

cmd.Parameters.Add("@QTYSOLD", SqlDbType.Int).Value = Convert.ToInt32(QTYORDER);

返回:"输入字符串格式不正确。"Int.Parse(QTYORDER)做同样的事情…

SQL存储过程变量:
Procedure [dbo].[SVC_AddPart_To_Service_Call]      
    (@SRVRECTYPE smallint,
     @CALLNBR char(11),
     @TECHID char(11),
     @LINITMTYP char(3),
     @ITEMNMBR char(31),
     @QTY numeric(19,5) = 0,
     @QTYSOLD numeric(19,5) = 0,
     @STARTDATE datetime = '01/01/1900 00:00:00',   
     @STARTTIME datetime = '01/01/1900 00:00:00',
     @ENDDATE datetime = '01/01/1900 00:00:00',
     @ENDTIME datetime = '01/01/1900 00:00:00',
     @Status int output) As ...

MVC c#代码:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["CPLU"].ConnectionString);
var cmd = new SqlCommand("SVC_AddPart_To_Service_Call", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@SRVRECTYPE", SqlDbType.SmallInt).Value = "2";
cmd.Parameters.Add("@CALLNBR", SqlDbType.Char).Value = CALLNBR;
cmd.Parameters.Add("@TECHID", SqlDbType.Char).Value = Session["TechID"];
cmd.Parameters.Add("@LINITMTYP", SqlDbType.Char).Value = "P";
cmd.Parameters.Add("@ITEMNMBR", SqlDbType.Char).Value = ITEMNMBR;
cmd.Parameters.Add("@QTY", SqlDbType.Int).Value = QTYORDER;
cmd.Parameters.Add("@QTYSOLD", SqlDbType.Int).Value = QTYORDER;
cmd.Parameters.Add("@STARTDATE", SqlDbType.DateTime).Value = "1900-01-01 00:00:00.000";
cmd.Parameters.Add("@STARTTIME", SqlDbType.DateTime).Value = "1900-01-01 00:00:00.000";
cmd.Parameters.Add("@ENDDATE", SqlDbType.DateTime).Value = "1900-01-01 00:00:00.000";
cmd.Parameters.Add("@ENDTIME", SqlDbType.DateTime).Value = "1900-01-01 00:00:00.000";
cmd.Parameters.Add("@STATUS", SqlDbType.Int);
cmd.Parameters["@STATUS"].Direction = ParameterDirection.Output;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

MVC Razor代码:

@using (Html.BeginForm()) 
{
    @Html.ValidationSummary(true)
    <fieldset>
            @Html.LabelFor(model => model.CALLNBR, "Call Number")
            @Html.Label("CALLNBR", (string)ViewBag.CALLNBR)
            @Html.ValidationMessageFor(model => model.ITEMDESC)
        <br />
            @Html.LabelFor(model => model.ITEMNMBR, "Item Number")
            @Html.DropDownList("ITEMNMBR", (SelectList) ViewBag.Items, "Please Select a Part #")
            @Html.ValidationMessageFor(model => model.ITEMNMBR)
        <br />
            @Html.LabelFor(model => model.ITEMDESC, "Description")
            @Html.EditorFor(model => model.ITEMDESC)
            @Html.ValidationMessageFor(model => model.ITEMDESC)
        <br />
            @Html.LabelFor(model => model.QTYORDER, "Quantity")
            @Html.EditorFor(model => model.QTYORDER, new { required = "required"})
            @Html.ValidationMessageFor(model => model.QTYORDER)
        <br />
            <input type="submit" class="submit" value="Add Part" />
    </fieldset>
}

值我试图通过表单:

CALLNBR = 0000198210 
ITEMNMBR = RF5-1885 (22 trailing spaces)
QTYORDER = 1

从SQL表中的一行获取的值:

CALLNBR = 0000198638  
ITEMNMBR = RM1-0043 (22 trailing spaces)
QTYORDER = 1.00000

问题:

1)由于SP有默认值编码为STARTDATE, STARTTIME, ENDDATE和ENDTIME…我需要在MVC应用程序上添加参数时提供这些值吗?

2)我如何在这里使用Try-Catch,这会给我一个更好的错误消息吗?有什么我可以跟进的吗?

3)是否有一种方法可以将QTYORDER值转换为c#中的小数点后5位?这将确保它在#中提交。00000格式…

注意事项:

我正在使用实体框架,但我不能将存储过程映射到该表的选择插入函数,因为该SP用于添加部件,而另一个SP用于添加劳动。

日志含义将参数值从String类型转换为Int32类型失败

要回答您的几个问题,您不需要向存储过程传递可选参数——它们将使用它们的默认值。

关于try-catch,只需在网上快速搜索并使用您的断点—我会将它放在您上面提供的整个代码块周围。应该能够更好地了解正在抛出的异常。

需要考虑的一些附加注释:

而不是尝试int。解析,使用int。TryParse:

int orderQty = 0;
int.TryParse(QTYORDER, out orderQty);
if (orderQty == 0)
    //You potentially have a problem with binding 

同样,您的代码将QTYORDER作为整数传递,但存储过程接受十进制。改变这个:

cmd.Parameters.Add("@QTY", SqlDbType.Int).Value = QTYORDER;

cmd.Parameters.Add("@QTY", SqlDbType.Decimal).Value = QTYORDER;

您确定QTYORDER不为空吗?MVC可能在这里丢失了模型绑定。快速检查一下它是否为空

放在添加参数之前,并在bool x行上添加一个断点,以查看是否命中。如果它是null,那么模型绑定有问题,检查你的模型代码

if(QTYORDER == null){
     bool x = true;
}

尝试修剪字符串以确保没有空格?

Convert.ToInt32(QTYORDER.Trim());

如果要将其转换为小数点后5位

Math.Round(Convert.ToDecimal(QTYORDER.Trim()), 5);