我正在使用MVC3和SQL2005。我收到错误消息:“将数据类型varchar转换为数值时出错。”我相信这是因为我为QTYORDER使用的是“ 1”而不是“ 1.00000”。现在为QTYORDER使用“ 1.00000”,我看到错误:“无法将参数值从字符串转换为Int32。”

我试过使用Convert.ToInt32(Variable),如下所示:

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

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

SQL存储的Proc变量:

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剃刀代码:

@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 App上添加参数时,是否需要提供这些值?

2)我将如何在此处使用Try-Catch并给我更好的错误消息?我实际上可以跟进吗?

3)有没有一种方法可以将QTYORDER值转换为C#中的5个小数位?这样可以确保它以#.00000格式提交...

注意事项:

我使用的是Entity Framework,但无法将存储过程映射到该表的“选择插入函数”,因为该SP用于添加零件,而另一个SP用于添加人工。

最佳答案

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

关于try-catching,只需在线快速搜索并使用断点即可—我将把它放在上面提供的整个代码块中。应该能够更好地了解所引发的异常。

需要考虑的其他一些评论:

而不是尝试int.parse,请使用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;

07-24 22:24