2

MVC3とSQL2005を使用しています。「データ型varcharから数値への変換中にエラーが発生しました」というエラーが発生していました。QTYORDERに「1.00000」ではなく「1」を使用していたため、これが発生したと思います。QTYORDERに「1.00000」を使用すると、「パラメータ値を文字列から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を使用していますが、そのSPがパーツの追加に使用され、別のSPが作業の追加に使用されるため、ストアドプロシージャをそのテーブルのSelectInsert関数にマップできません。

4

2 に答える 2

3

いくつかの質問に答えるために、オプションのパラメーターをストアード・プロシージャーに渡す必要はありません。それらはデフォルト値を使用します。

トライキャッチに関しては、オンラインでクイック検索を実行し、ブレークポイントを使用します。上記で提供したコードのブロック全体に配置します。スローされる例外についてより良いアイデアを得ることができるはずです。

考慮すべきいくつかの追加コメント:

int.parseを試す代わりに、int.TryParseを使用します。

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

また、コードはQTYORDERを整数として渡していますが、ストアドプロシージャは10進数を受け入れています。これを変える:

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

cmd.Parameters.Add("@QTY", SqlDbType.Decimal).Value = QTYORDER;
于 2013-01-07T18:01:53.180 に答える
1

QTYORDERがnullではないことを確認しますか?MVCはここでモデルバインディングを失った可能性があります。クイックチェックを実行して、nullかどうかを確認します

paramsを追加する前にこれを配置し、bool x行にブレークポイントを追加して、ヒットするかどうかを確認します。nullの場合は、モデルバインディングに問題があります。モデルコードを確認してください

if(QTYORDER == null){

     bool x = true;

}

文字列をトリミングして、スペースがないことを確認してみてください。

Convert.ToInt32(QTYORDER.Trim());

これを小数点以下5桁に変換したい場合

Math.Round(Convert.ToDecimal(QTYORDER.Trim()), 5);
于 2013-01-07T17:07:17.267 に答える