SQL输出参数
我有一个调查问卷,它存储了每个进行测试的用户的答案。我需要将输出存储在数据库中(这是用户进行测试)。我不太确定我做错了什么。目前我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
我有一种感觉,我不需要在这两个程序用的输出。
这是问题的至少一部分:
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;
此外,我建议使用'SCOPE_IDENTITY()'而不是'@@ IDENTITY',因为第一个将返回存储过程插入的最后一个标识值,第二个将返回最后一个标识,而不管它是如何插入的或者什么桌子。欲了解更多信息,[阅读本文](http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-记录/) –
@ZoharPeled:我会把你的话,但留在那里作为一个评论,而不是试图把它放到我的答案。基本上我只倾向于理解像这样的问题的客户端:) –
ParameterDirection.Output没有工作,因为它返回一个InvalidCast错误,但InputOut方法完美工作! :) 谢谢! –
变化'IF(@InputID = 0)''到IF(@InputID是NULL)'否则你'@ InputID'决不会与标识值被分配 –
不要使用'nchar'没有长度。 –