2013-07-09 83 views
3

我遇到了最後一行受影響的ID問題,它返回0,這意味着它在插入格式時出錯。我執行了存儲過程並手動添加了值,它返回了正確的ID。但是當我試圖用代碼來實現它時,它會一直返回0或-1 ......我昨晚在幾個小時後嘗試了這一點,而且我已經對它給予我的值感到困惑。SQL Scope_Identity正在返回0或-1

C#:

conn.Open(); 

      cmd.Parameters.AddWithValue("@fileName", fileName); 
      cmd.Parameters.AddWithValue("@filePrivacy", filePrivacy); 

      cmd.Parameters.AddWithValue("@filePassword", filePassword); 

      cmd.Parameters.AddWithValue("@fileDescription", fileDesc); 
      cmd.Parameters.AddWithValue("@fileOwner", fileOwner); 
      cmd.Parameters.AddWithValue("@fileDate", DateTime.Now); 
      cmd.Parameters.AddWithValue("@fileExpire", DateTime.Now.AddMinutes(fileExpire)); 
      cmd.Parameters.AddWithValue("@fileCodeText", fileType); 
      var fileID = cmd.Parameters.Add("@fileID", SqlDbType.Int); 
      fileID.Direction = ParameterDirection.Output; 

      int returnfileID = (int)cmd.ExecuteScalar(); 
      return returnfileID; 

存儲過程:

CREATE PROCEDURE [dbo].[Upload] 
@fileName nvarchar(20), 
@filePrivacy int, 
@filePassword nvarchar(50), 
@fileDescription nvarchar(200), 
@fileOwner nvarchar(14), 
@fileDate smalldatetime, 
@fileExpire smalldatetime, 
@fileCodeText int, 
@fileID int out 

AS 
INSERT INTO Files ([FileName], FilePrivacy, FilePassword, FileDescription, FileOwner, FileDate, FileExpire, FileCodeText) 
VALUES (@fileName, @filePrivacy, @filePassword, @fileDescription, @fileOwner, @fileDate, @fileExpire, @fileCodeText) 
SET @fileID = SCOPE_IDENTITY() 
RETURN @fileID 

SQL表:

CREATE TABLE [dbo].[Files] (
[Id]    INT   IDENTITY (1, 1) NOT NULL, 
[FileName]  NVARCHAR (20) NOT NULL, 
[FilePrivacy]  INT   NOT NULL, 
[FilePassword] NVARCHAR (50) NULL, 
[FileDescription] NVARCHAR (200) NULL, 
[FileOwner]  NVARCHAR (14) NOT NULL, 
[FileDate]  SMALLDATETIME NOT NULL, 
[FileExpire]  SMALLDATETIME NOT NULL, 
[FileCodeText] INT   NOT NULL, 
PRIMARY KEY CLUSTERED ([Id] ASC) 
); 
+1

你已經聲明'fileID'是一個'OUTPUT'參數,但你永遠不會從它獲得值。 –

回答

4

ExecuteScalar「執行查詢,並返回第一行的第一列查詢返回的結果集。額外的列或行被忽略'

如果您選擇@fileID(而不是返回)它應該工作。
或者,您可以在執行查詢後訪問@fileID參數值,在這種情況下,沒有實際點具有ExecuteScalar,您可以將其更改爲ExecutenonQuery

+0

ExecutenonQuery返回受影響的行數。 :\ –

+0

更新回答 – NDJ

+0

我如何在執行後訪問它? ExecuteScalar得到它應該的,我認爲它是一些無效的文件類型。 –

0

使用的SQL

SET @fileID= SCOPE_IDENTITY() RETURN @fileID 

SELECT @@IDENTITY; 

,並在C#代碼

int returnfileID = Convert.ToInt32(cmdInsert.ExecuteScalar()) 
0

我最初的想法是,你得到回存儲過程返回代碼。由於您已將其設置爲OUTPUT參數,因此@fileID應該由您的存儲過程返回。從存儲過程中刪除RETURN。它應該返回輸出變量而不是執行代碼。

+0

這是關於被放入參數的數據的東西。 –