- PR -

SQL Delete でエラー ParameterName '@OrderID' .....

1
投稿者投稿内容
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-08-14 08:54
お世話になります。

SQLでDeleteしようとすると下記のエラーが出ます。
「ParameterName '@OrderID' を持つ SqlParameter は、この SqlParameterCollection に含まれていません。」

コード:
string stUpdateOrderIDForDelete;

protected void SqlDataSource3_Deleting(object sender, SqlDataSourceCommandEventArgs e)
{
     e.Command.Parameters["@OrderID"].Value = stUpdateOrderIDForDelete;
}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    foreach (DictionaryEntry entry in e.Values)
    {
        e.Values[entry.Key] = Server.HtmlEncode(entry.Value.ToString());
    }
    stUpdateOrderIDForDelete = (string)e.Values["OrderID"];
}


「データソース構成」のストアドプロシージャの定義で[Delete]タブ
DELETE FROM Schedule WHERE (OrderID = @OrderID)
[UPDATE][SELECT]は、動いています。
UPDATE Schedule SET KanjaMei = @KanjaMei, Age = @Age, Sex = @Sex WHERE (OrderID = @OrderID)
SELECT OrderID, UserID, KanjaMei, Age, Sex, StartDate, StartTime, Device, MemoryNo FROM Schedule WHERE (UserID LIKE @UserID) AND (StartDate BETWEEN @StartDate AND @EndDate) ORDER BY StartDate, StartTime

また、上記のDelete は、ストアド内の「クエリビルダ」「クエリ実行」でパラメータを直接入れるとそれは削除されます。
aspx.cs の SqlDataSource3_Deleting() からうまき行きません。
教えてください。
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-08-19 08:38
お世話になります。

ネット上などで調べる限り原因を見つけられません。
とりあえず、削除を更新に変えて削除フラグをセットするというページがあったので下記のように変更してみましたが、エラーが出ます。このエラーは、「削除」のときもたまに出ていましたが「宣言を指定ください」の意味がわかりません。教えてください。
エラー:「スカラ変数 "@OrderID" を宣言してください」
参照サイト:http://dotnetfan.org/blogs/dotnetfanblog/archive/2007/01/04/2316.aspx

コード:

.aspx
<asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:ScheduleConnectionString %>"
OnSelecting="SqlDataSource3_Selecting" SelectCommand="SELECT OrderID, UserID, KanjaMei, Age, Sex, StartDate, StartTime, Device, MemoryNo FROM Schedule WHERE (UserID LIKE @UserID) AND (StartDate BETWEEN @StartDate AND @EndDate) AND (DelFlg = 0) ORDER BY StartDate, StartTime" UpdateCommand="UPDATE Schedule SET KanjaMei = @KanjaMei, Age = @Age, Sex = @Sex WHERE (OrderID = @OrderID)" OnUpdating="SqlDataSource3_Updating" DeleteCommand="UPDATE Schedule SET DelFlg = 1 WHERE (OrderID = @OrderID)" OnDeleting="SqlDataSource3_Deleting">
<SelectParameters>
<asp:Parameter Name="UserID" />
<asp:Parameter Name="StartDate" />
<asp:Parameter Name="EndDate" />
</SelectParameters>
<UpdateParameters>
<asp:Parameter Name="KanjaMei" />
<asp:Parameter Name="Age" />
<asp:Parameter Name="Sex" />
<asp:Parameter Name="OrderID" />
</UpdateParameters>
<DeleteParameters>
<asp:Parameter Name="OrderID" />
</DeleteParameters>
</asp:SqlDataSource>

.aspx.cs
protected void SqlDataSource3_Deleting(object sender, SqlDataSourceCommandEventArgs e)
{

}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
foreach (DictionaryEntry entry in e.Values)
{
e.Values[entry.Key] = Server.HtmlEncode(entry.Value.ToString());
}

stUpdateOrderIDForDelete = (string)e.Values["OrderID"];
SqlDataSource3.DeleteParameters["OrderID"].DefaultValue = stUpdateOrderIDForDelete;
//SqlDataSource3.DeleteParameters["DelFlg"].DefaultValue = "true";
}



ASP.NET C# VS2005

[ メッセージ編集済み 編集者: SL 編集日時 2008-08-19 08:46 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-08-25 02:21
たぶん、GridViewのDataKeyNamesを設定しないとDeleteCommandには自動では渡されないのが
原因でしょう。設定すればC#側のコーディングは不要なはずです。

どちらの例のGridView1_RowDeletingも何をしようとしているのかよくわかりませんが、
やるならSqlDataSourceのDeletingで
e.Command.Parameters.Add(new SqlParameter("@名前",値));
でしょう。
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-08-25 09:37
お世話になります。

protected void SqlDataSource3_Deleting(object sender, SqlDataSourceCommandEventArgs e)
{

e.Command.Parameters.Add(new SqlParameter("@OrderID", stUpdateOrderIDForDelete));
}
とすることでできました。
Add で変数を追加宣言しているのですね。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)