2015-07-20 93 views
0

我有一个调查问卷,它存储了每个进行测试的用户的答案。我需要将输出存储在数据库中(这是用户进行测试)。我不太确定我做错了什么。目前我inputID返回0(InputAnswers输入该用户的数据库测试的答案)SQL输出参数

CREATE PROCEDURE [dbo].[InputAnswers] 

@QuestionID int, 
@InputID int OUTPUT, 
@Answer nchar, 
@Remark nvarchar(50) 

AS 
BEGIN 

SET NOCOUNT ON; 

INSERT INTO Answers (InputID, QuestionID, Answer, Remark) VALUES (@InputID, @QuestionID, @Answer, @Remark) 

END 

下面的代码加载从保存的问题列表视图中的答案:

 private void LoadAnswers(int inputID) 
     { 
     foreach (StepControl step in dckSteps.Children) 
     { 
      foreach (QuestionControl quest in step.listQuestions.Items) 
      { 
       int questionID = quest.questionID; 
       string answer = quest.answer; 
       string remark = quest.txtRemark.Text; 

       SqlConnection conDatabase = new SqlConnection(String.Format(@"Data Source={0};Initial Catalog={1};Persist Security Info=True;User ID={2};Password={3}", SQLSERVER_ID, SQLDatabaseName, SQLServerLoginName, SQLServerPassword)); 
       string query = "InputAnswers"; 

       SqlCommand cmd = new SqlCommand(query, conDatabase); 
       cmd.CommandType = CommandType.StoredProcedure; 

       cmd.Parameters.Add("@InputID", SqlDbType.Int).Value = inputID; 
       cmd.Parameters.Add("@QuestionID", SqlDbType.Int).Value = questionID; 
       cmd.Parameters.Add("@Answer", SqlDbType.NChar).Value = answer; 
       cmd.Parameters.Add("@Remark", SqlDbType.NVarChar).Value = remark; 

       conDatabase.Open(); 
       cmd.ExecuteNonQuery(); 
       conDatabase.Close(); 
      } 
     } 
    } 

我然后负载这些答案到按钮点击方法:

 private void btnSubmit_Click(object sender, RoutedEventArgs e) 
     { 
     string name = txtName.Text; 
     string cno = txtCNO.Text; 
     var date = datePicker.SelectedDate; 
     int inputID = 0; 

     SqlConnection conDatabase = new SqlConnection(String.Format(@"Data Source={0};Initial Catalog={1};Persist Security Info=True;User ID={2};Password={3}", SQLSERVER_ID, SQLDatabaseName, SQLServerLoginName, SQLServerPassword)); 
     string query = "SaveInput"; 

     SqlCommand cmd = new SqlCommand(query, conDatabase); 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.Add("@InputID", SqlDbType.Int).Value = ParameterDirection.Output; 
     cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = name; 
     cmd.Parameters.Add("@CNO", SqlDbType.NVarChar).Value = cno; 
     cmd.Parameters.Add("@Date", SqlDbType.DateTime).Value = date; 

     conDatabase.Open(); 
     cmd.ExecuteNonQuery(); 
     conDatabase.Close(); 

     LoadAnswers(inputID); 
     } 

这一切都正常工作除了将输出发送到数据库。有任何想法吗?

编辑:程序SaveInput看起来是这样的:(SaveInput存储用户信息)

CREATE PROCEDURE [dbo].[SaveInput] 

@InputID int OUTPUT, 
@Name nvarchar(50), 
@CNO nvarchar(50), 
@Date DATETIME 

AS 
BEGIN 

SET NOCOUNT ON; 

IF(@InputID = 0) 
BEGIN 

INSERT INTO Input (Name, CNO, Date) VALUES (@Name, @CNO, @Date) 
SET @InputID = @@IDENTITY 
END 
ELSE 
BEGIN 

UPDATE Input SET Name = @Name, 
CNO = @CNO, 
Date = @Date 
WHERE InputID = @InputID 

END 
END 

我有一种感觉,我不需要在这两个程序用的输出。

+0

变化'IF(@InputID = 0)''到IF(@InputID是NULL)'否则你'@ InputID'决不会与标识值被分配 –

+0

不要使用'nchar'没有长度。 –

回答

3

这是问题的至少一部分:

cmd.Parameters.Add("@InputID", SqlDbType.Int).Value = ParameterDirection.Output; 

这是创建一个输入参数 - 但给它一个这是枚举值ParameterDirection.Output。你想:

cmd.Parameters.Add("@InputID", SqlDbType.Int).Direction = ParameterDirection.Output; 

然后,您需要获取从参数结果执行命令后:

cmd.ExecuteNonQuery(); 
// You might want to store the parameter reference in a local variable instead 
// of fetching it again afterwards. 
int inputId = (int) cmd.Parameters["@InputID"].Value; 

如果你想在参数输入/输出虽然,你应该使用ParameterDirection.InputOutput(并在执行命令之前给它一个值)。例如:

int inputId = ...; 

var inputIdParameter = cmd.Parameters.Add("@InputID", SqlDbType.Int); 
inputIdParameter.Direction = ParameterDirection.InputOutput; 
inputIdParameter.Value = inputId; 

... 
cmd.ExecuteNonQuery(); 
inputId = (int) inputIdParameter.Value; 
+0

此外,我建议使用'SCOPE_IDENTITY()'而不是'@@ IDENTITY',因为第一个将返回存储过程插入的最后一个标识值,第二个将返回最后一个标识,而不管它是如何插入的或者什么桌子。欲了解更多信息,[阅读本文](http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-记录/) –

+0

@ZoharPeled:我会把你的话,但留在那里作为一个评论,而不是试图把它放到我的答案。基本上我只倾向于理解像这样的问题的客户端:) –

+0

ParameterDirection.Output没有工作,因为它返回一个InvalidCast错误,但InputOut方法完美工作! :) 谢谢! –