我正在使用MVC3和SQL 2005.我收到错误:“将数据类型varchar转换为数字时出错。”我相信这是因为我使用“1”而不是“1.00000”来表示QTYORDER。对QTYORDER使用“1.00000”我现在看到错误:“无法将参数值从String转换为Int32。”
我尝试过使用Convert.ToInt32(Variable),如下所示:
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剃刀代码:
@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格式提交......
考虑:
我正在使用Entity Framework,但我无法将Stored Proc映射到该表的Select Insert Function,因为该SP用于添加部件,而另一个SP用于添加人工。
答案 0 :(得分:3)
要回答几个问题,您不需要将可选参数传递给存储过程 - 它们将使用其默认值。
关于尝试捕获,只需在线快速搜索并使用您的断点 - 我会把它放在您上面提供的整个代码块中。应该能够更好地了解被抛出的异常。
需要考虑的其他一些评论:
使用int.TryParse:
而不是尝试int.parseint 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;
答案 1 :(得分:1)
你确定QTYORDER不是空的吗? MVC可能在这里丢失了模型绑定。快速检查一下它是否为空
在添加params并在bool x线上添加断点以查看它是否命中之前将其放入。如果它为null,那么模型绑定有问题,请检查模型代码
if(QTYORDER == null){
bool x = true;
}
尝试修剪字符串以确保没有空格?
Convert.ToInt32(QTYORDER.Trim());
如果您想将其转换为5位小数
Math.Round(Convert.ToDecimal(QTYORDER.Trim()), 5);