2011-04-10 47 views
0

我試圖抓取最近插入的表的ID,但我不斷收到轉換錯誤。該項目總是包含NULL,我不知道爲什麼。我下面設在這裏說明: http://www.mikesdotnetting.com/Article/54/Getting-the-identity-of-the-most-recently-added-record當試圖抓取插入的ID時,強制轉換無效

這裏是我的SqlDataSource:

<asp:SqlDataSource ID="SqlDataSource2" runat="server" 
    ConnectionString="<%$ ConnectionStrings:NH_SWAGConnectionString %>"    
    InsertCommand="INSERT INTO [tblOrders] ([OrderDate], [OrderTotal], [OrderAccount], [OrderCostCentre]) VALUES (@OrderDate, @OrderTotal, @OrderAccount, @OrderCostCentre); SET @OrderNewID = SCOPE_IDENTITY()" 
    SelectCommand="SELECT * FROM [tblOrders]" 
    UpdateCommand="UPDATE [tblOrders] SET [OrderDate] = @OrderDate, [OrderTotal] = @OrderTotal, [OrderAccount] = @OrderAccount, [OrderCostCentre] = @OrderCostCentre WHERE [OrderID] = @original_OrderID AND [OrderDate] = @original_OrderDate AND [OrderTotal] = @original_OrderTotal AND [OrderAccount] = @original_OrderAccount AND [OrderCostCentre] = @original_OrderCostCentre"    
    ConflictDetection="CompareAllValues" 
    OldValuesParameterFormatString="original_{0}" 
    OnInserting="SqlDataSource2_Inserting" 
    OnInserted="SqlDataSource2_Inserted"> 
    <InsertParameters> 
     <asp:Parameter Direction="Output" Name="OrderNewId" Type="Int32" /> 
    </InsertParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="OrderDate" Type="DateTime" /> 
     <asp:Parameter Name="OrderTotal" Type="Decimal" /> 
     <asp:Parameter Name="OrderAccount" Type="String" /> 
     <asp:Parameter Name="OrderCostCentre" Type="String" /> 
     <asp:Parameter Name="original_OrderID" Type="Int32" /> 
     <asp:Parameter Name="original_OrderDate" Type="DateTime" /> 
     <asp:Parameter Name="original_OrderTotal" Type="Decimal" /> 
     <asp:Parameter Name="original_OrderAccount" Type="String" /> 
     <asp:Parameter Name="original_OrderCostCentre" Type="String" /> 
    </UpdateParameters> 
</asp:SqlDataSource> 

這裏是後面插入新記錄,並呼籲SCOPE_IDENTITY()抓住新的ID代碼:

protected void btnOrder_Click(object sender, EventArgs e) 
{ 
    //Add entry to Order Table  

    SqlDataSource2.InsertParameters.Add("OrderDate", DateTime.Now.ToString("MMMM dd, yyyy")); 
    SqlDataSource2.InsertParameters.Add("OrderTotal", "0"); 
    SqlDataSource2.InsertParameters.Add("OrderAccount", ItmUser); 
    SqlDataSource2.InsertParameters.Add("OrderCostCentre", ItmCostCode.Text); 

    SqlDataSource2.Insert(); 
} 

protected void SqlDataSource2_Inserted(object sender, SqlDataSourceStatusEventArgs e) 
{ 
    OrderNewID = (int)e.Command.Parameters["@OrderNewId"].Value; 
} 

爲什麼@OrderNewId以上是NULL?

+1

Insert * work *?在我看來,它需要更多的參數在'InsertParameters'(xml)中定義。但是,我從來沒有使用'asp:SqlDataSource',所以我可以離開基地 – 2011-04-10 07:35:31

+0

@MarcGravell是的,如果我註釋掉代碼的Inserted()部分中的行,插入的工作。我定義的參數值代碼隱藏在btn_click()事件中。 – Kolten 2011-04-10 17:49:36

回答

0

好吧,我明白了。替代使用SET,我在InsertQuery中使用了SELECT:

INSERT INTO [tblOrders] ([OrderDate], [OrderTotal], [OrderAccount], [OrderCostCentre]) VALUES (@OrderDate, @OrderTotal, @OrderAccount, @OrderCostCentre); SELECT @OrderNewID = SCOPE_IDENTITY() 
+0

不要忘記接受你的答案是正確的。 – abatishchev 2011-04-10 18:52:12

相關問題