2012-07-25 22 views
3

我意識到這個問題已經被回答過了,我已經查看了答案,試圖找到我的方式的錯誤,但是處於停滯狀態。我有以下存儲過程應該返回一個唯一的密鑰。用c輸出參數運行存儲的sql程序#

GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 
ALTER PROCEDURE [dbo].[newid] @tablename AS CHAR(10), @fieldname AS CHAR(15) = '', @ioffset AS INT, @theID as int = 0 output 
AS 
BEGIN 
    SET NOCOUNT ON 

DECLARE @value AS INT 
IF @ioffset < 1 SET @ioffset = 1 
IF LEN(@fieldname) > 0 
    BEGIN 
    UPDATE id SET @value = CONVERT(INT,cvalue)[email protected], cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)[email protected])) WHERE UPPER(ctablename) = UPPER(@tablename) AND UPPER(cfieldname) = UPPER(@fieldname) 
    SELECT @value 
    END 
ELSE 
    BEGIN 
    UPDATE id SET @value = CONVERT(INT,cvalue)[email protected], cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)[email protected])) WHERE UPPER(ctablename) = UPPER(@tablename) 
    SELECT @value 
    End 
SET NOCOUNT OFF 
set @theID = @value 
END 

我使用下面的代碼嘗試訪問的過程:

using(SqlConnection connection = new SqlConnection(connectionString)) 
using(SqlCommand command = new SqlCommand("dbo.NewID", connection) 
    { CommandType = CommandType.StoredProcedure }) 
{ 
    command.Parameters.Add(new SqlParameter("@tablename",table)); 
    command.Parameters.Add(new SqlParameter("@fieldname",field)); 
    command.Parameters.Add(new SqlParameter("@ioffset",1)); 
    SqlParameter key = new SqlParameter("@theID", SqlDbType.Int); 
    key.Direction = ParameterDirection.Output; 
    command.Parameters.Add(key); 

    connection.Open(); 
    result = command.ExecuteNonQuery(); 
    connection.Close(); 
} 

key.Value是回來了空,結果是-1,暗示有正在運行的程序錯誤。如果有人看到我可能做錯了,我將不勝感激這種幫助。

只是說明:我不能編輯實際的過程,因爲有幾個類已經使用它。

非常感謝您的幫助。

+1

我建議你編寫你自己的測試程序,它簡單地使用參數並返回輸出,這樣你就可以確保你的command.Parameters邏輯是正確的。然後逐步添加邏輯以達到您的原始要求。使用{}使用+1! – n8wrl 2012-07-25 19:34:41

+0

你確定你打電話給你的程序嗎?你有沒有嘗試分析你的電話,看看發送了什麼? – 2012-07-25 19:35:03

+0

另一個想法 - 如果您在創建命令對象之前打開連接,該怎麼辦? – n8wrl 2012-07-25 19:35:45

回答

1

議決

謝謝所有的回覆很多,我得到的。我接受了Steve的建議,並從SQL Management Studio運行了該程序,並在那裏遇到了問題。擺弄周圍與我輸入了一下後,我發現我是用

String table = "dbo.tablename";

當我把它改爲

String table = "tablename";

一切開始工作正常。

對我而言,這是一個愚蠢的錯誤,原因是沒有足夠牢牢掌握SQL。再次感謝大家的精彩建議。

2

我會嘗試改變這一行:

command.Parameters.Add(new SqlParameter("@ioffset",1)); 

SqlParameter pOffset = command.Parameters.Add(new SqlParameter("@ioffset", SqlDbType.Int)); 
pOffset.Value = 1; 

有一個在你使用的是構造一個已知的bug。看看community comments on MSDN
這個問題已經被新的方法SqlParameter.AddWithValue該刪除的標準構造

+0

你可以使用'command.Parameters.AddWithValue(name,value)'。 – 2012-07-25 19:50:04

0
command.Parameters.Add(new SqlParameter("@tablename",table)); 
command.Parameters.Add(new SqlParameter("@fieldname",field)); 
command.Parameters.Add(new SqlParameter("@ioffset",1)); 

的不確定性。如果您添加到參數列表這樣你應該指定參數的類型而有所解決。

或者你可以做這樣它可能會工作:

command.Parameters.AddWithValue("@tablename",table); 
command.Parameters.AddWithValue("@fieldname",field); 
command.Parameters.AddWithValue("@ioffset",1); 

試試吧。

相關問題