2012-01-31 11 views
1

私は、SqlDataSourceにリンクされたGridViewを使用してSQLテーブルに挿入するasp.netアプリケーションを持っています。問題は、挿入時に使用する 'Identity'パラメータがわからないことです。 'Identity'列は自動的にインクリメントされるはずですが、挿入時にIdentityパラメータがnullであってはならないという例外があります。どのようにしてこの動作ができるようにinsert文を作成するか、次の正しいIDを指定する方法#ありがとう。ここでASP.NET:SqlDataSource insert-identityパラメータ

は私のSqlDataSourceコードです:

<asp:SqlDataSource ID="VehiclesSqlDS" runat="server" 
     ConnectionString="<%$ ConnectionStrings:RamRideOpsConnectionString %>" 
     SelectCommand="SELECT * FROM [Vehicles]" 
     ConflictDetection="CompareAllValues" 
     InsertCommand="INSERT INTO [Vehicles] ([Identity], [CarNum], [MaxPassengers], [Status], [CurrPassengers], [StartAdd], [EndAdd], [AvgRideTime], [numRides]) VALUES (@Identity, @CarNum, @MaxPassengers, @Status, @CurrPassengers, @StartAdd, @EndAdd, @AvgRideTime, @numRides)" 
     OnInserting="VehiclesSqlDS_Insert" 
     OldValuesParameterFormatString="original_{0}">   
     <InsertParameters> 
      <asp:Parameter Name="Identity" Type="Int32 "/> 
      <asp:Parameter Name="CarNum" Type="Int32" DefaultValue="-1"/> 
      <asp:Parameter Name="MaxPassengers" Type="Int32" DefaultValue="3" /> 
      <asp:Parameter Name="Status" Type="String" DefaultValue="Ready" /> 
      <asp:Parameter Name="CurrPassengers" Type="Int32" DefaultValue="0" /> 
      <asp:Parameter Name="StartAdd" Type="String" /> 
      <asp:Parameter Name="EndAdd" Type="String" /> 
      <asp:Parameter DbType="Time" Name="AvgRideTime" /> 
      <asp:Parameter Name="numRides" Type="Int32" DefaultValue="0" /> 
     </InsertParameters>   
    </asp:SqlDataSource> 

答えて

3

IDの値を取得するには、パラメータの方向をOUTPutに設定する必要があります。 MSDN

からと取得するonInsertedイベントを処理、ID値

protected void SqlDataSource1_Inserted(object sender, SqlDataSourceStatusEventArgs e) 
    { 
     string sID = e.Command.Parameters["@Identity"].Value.ToString(); 
     //Display new ID 

    } 

あなたはこのように試すことができます。

<asp:sqlDataSource ID="Datasource" 
    SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID" 

    InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName); 
       SELECT @EmpID = SCOPE_IDENTITY()" 
    UpdateCommand="UPDATE Employees SET [email protected], [email protected] 
        WHERE [email protected]" 
    DeleteCommand="DELETE Employees WHERE [email protected]" 

    ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>" 
    OnInserted="EmployeeDetailsSqlDataSource_OnInserted" 
    RunAt="server"> 

    <SelectParameters> 
    <asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" /> 
    </SelectParameters> 

    <InsertParameters> 
    <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" /> 
    </InsertParameters> 

</asp:sqlDataSource> 
+0

これは正しいようですが、私はまだnull例外、任意のアイデアはなぜこれがありますか? [SCOPE_IDENTITYがnullであるようです] – SHeinema

+0

あなたはそれをデバッグしましたか? MSDNのリンクに従います。それは助けになるかもしれません –

+0

ええ、デバッグ、リンクを見て、ちょうど戻ってそれがあった方法を入れて、1つの挿入のために働くはずだったランダムなデフォルト値を選んだが、それは常に私にnullエラーを与える.. – SHeinema

1

あなたはINSERT文からID列を省略しなければなりません。データ列のみを含める。 SQL Serverは自動増分を作成します。

INSERT INTO [Vehicles] ([CarNum], [MaxPassengers], [Status], [CurrPassengers], [StartAdd], [EndAdd], [AvgRideTime], [numRides]) VALUES (@CarNum, @MaxPassengers, @Status, @CurrPassengers, @StartAdd, @EndAdd, @AvgRideTime, @numRides) 
+0

を追加しましたが、私が言ったように、残念ながら、私は次の例外を取得します: "列 'ID'、テーブル 'CWIS29RamRideOps.dbo.Vehicles'にNULL値を挿入できません;列はNULLを許可しませんINSERTは失敗します。 ステートメントが終了しました。 – SHeinema

1

これは、Identityが自動インクリメントされた列であることを前提としています。それはちょうど通常の列である可能性があります。

挿入する前に、何らかの方法で最新のIDを取得する必要があります。

また、新しい項目が追加されたときにIdentity列を自動的に更新するトリガをデータベースに書き込むこともできます。

+0

私は前のIDを取得しようとしましたが、これは簡単でしたが、この特定のテーブルでは空でないことは珍しくありません。最初の挿入時には、 1にリセットされていません。私はasp.netとSQLにいくぶん新しいです、あなたはトリガを書く上の良いリソースがありますか?それはトリックを行う可能性があります.. – SHeinema

1

これらのスニペットは役立つことがあります。

<InsertParameters> 
    <asp:Parameter Name="SalesRepID" Type="Int32" /> 
    ...more params 

    <asp:Parameter Name="QuoteID" Type="Int32" Direction="Output" />    
</InsertParameters> 

注2番目のコマンドは、明白な解決策だろう

InsertCommand="INSERT INTO [MyTable] (fields); SET @QuoteID = Scope_Identity();" 
+0

これは正しい方法ですが、何らかの理由でIdentityがnullにならないという同じエラーが発生しています。何が間違っているかも考えていますか? – SHeinema

+1

データベーステーブルが構築されていないようですIDを自動的にインクリメントします。 –

+0

うん、あなたはそれを持って、愚かな間違いは、どうにかしてオフになった。ありがとう。 – SHeinema