【问题标题】:ExecuteScalar() return 0 valueExecuteScalar() 返回 0 值
【发布时间】:2017-05-11 07:14:30
【问题描述】:

我搜索了这个标题,但没有找到有用的东西。

看看我的代码:

string q = "exec searchUser {0}";
q = string.Format(q, id);

SqlCommand cm2 = new SqlCommand();
cm2.Connection = sqlCon;
cm2.CommandText = q;

SqlDataAdapter sqldadapter1 = new SqlDataAdapter(cm2);

DataTable dataTabel1 = new DataTable();
sqldadapter1.Fill(dataTabel1);

if (sqlCon.State != ConnectionState.Open)
{
    sqlCon.Open();
}

cm2.ExecuteNonQuery();

if (sqlCon.State != ConnectionState.Closed)
{
    sqlCon.Close();
}

string uname = dataTabel1.Rows[0][1].ToString();
string logName = dataTabel1.Rows[0][2].ToString();
//DateTime.Now;
int countTrue = listBox_checked.Items.Count;
int countFalse = listBox_LogicFault.Items.Count;

MessageBox.Show(countTrue+"");
MessageBox.Show(countFalse+"");
MessageBox.Show(DateTime.Now.ToString());

DateTime time = DateTime.Now;
//string format = "yyyy-MM-dd HH:mm:ss";

string query_insertReport = "exec insertReport {0},{1},{2},'{3}',{4}, {5},'{6}'";            
query_insertReport = string.Format(query_insertReport, id, uname, logName, time, countFalse, countTrue, sendFilename.filename);

SqlCommand cmdInsertReport = new SqlCommand();
cmdInsertReport.Connection = sqlCon;
cmdInsertReport.CommandText = query_insertReport;

if(sqlCon.State != ConnectionState.Open)
{
    sqlCon.Open();
}

int idd = Convert.ToInt32 (cmdInsertReport.ExecuteScalar());
MessageBox.Show(idd+"report ID value");    

if (sqlCon.State != ConnectionState.Closed)
{
    sqlCon.Close();
}

MessageBox.Show("Report Inserted");

我的代码的第二部分有一个问题,我想将报告插入到报告表中,并使用ExecuteScalar() 获取每条记录的报告ID,因为我想将它插入到其他表中。插入已成功完成,但 ExecuteScalar() 返回 0 值(错误值)。我在报告表中有一些记录,数字从 32 开始。有什么问题?

这是我的存储过程:

ALTER PROCEDURE [dbo].[insertReport]
    @userID int,
    @userName nvarchar(50),
    @logicName nvarchar(50),
    @date datetime,
    @faultNumber int,
    @trueNumber int,
    @fileName nvarchar(MAX)
AS
    INSERT INTO Reports ([UserID], [UserName], [LogicName], [Date],[FaultNumber], [TrueNumber], [filename]) 
    VALUES (@userID, @userName, @logicName, @date, @faultNumber, @trueNumber, @fileName)

【问题讨论】:

  • 这种情况下ExecuteScalar的返回值就是你的存储过程insertReport的返回值。如果您没有选择新的报告 ID,它将为 0 表示成功。
  • 为什么你认为它是一个错误的值?你的存储过程返回什么? 存储过程在哪里?如果您没有任何RETURN 或SELECT 语句,为什么ExecuteScalar 会返回非零值?
  • 你在哪里“填充”"exec searchUser {0}" 中的参数 {0}?
  • 除了返回值问题,请使用参数而不是String.Format来使您的代码safe for SQL injection。
  • 顺便说一句,您的代码没有使用参数,只是使用字符串连接来创建易受 SQL 注入和转换问题影响的 SQL 语句。使用 proper 参数化查询和适当的参数。由于您调用的是存储过程,您只需将存储过程名称设置为CommandText,然后使用存储过程参数名称开始使用.Parameters.Add 添加参数

标签: c# sql-server ado.net


【解决方案1】:

我知道出了什么问题。问题是 SQl 代码不是 C# 和 ADO.net。我需要添加此行代码。

select CAST (SCOPE_IDENTITY() As int)

在我修改我的程序后,现在 ExecuteScalar() 返回真值。 完整的程序代码:

ALTER procedure [dbo].[insertReport]
@userID int,
@userName nvarchar(50),
@logicName nvarchar(50),
@date datetime,
@faultNumber int,
@trueNumber int,
@fileName nvarchar(MAX)

as

INSERT into Reports ([UserID],[UserName],[LogicName],[Date],[FaultNumber],[TrueNumber],[filename]) values (@userID,@userName,@logicName,@date,@faultNumber,@trueNumber,@fileName)
select CAST (SCOPE_IDENTITY() As int)

【讨论】:

  • 这正是大家在 cmets 部分告诉你的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2023-03-14
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多