我正在使用函数的返回值填充文本框,但如果我在函数内部运行sql代码,它就不起作用。我可以删除sql相关的代码,它的工作原理。所以我很难过。
并且"没有工作"我的意思是文本框永远不会被任何东西填充。它仍然是空白。
感谢
public string CreateResident()
{
string result = "hmm";
SqlConnection sqlConnection = new SqlConnection("Server=DELLXPS\\SQLEXPRESS; Initial Catalog=Warren_SEINDATASYSTEMS; Integrated Security=true;");
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "INSERT INTO [dbo].[NewUsers]([ResidentAccountNumber],[ResidentName],[ResidentAddress],[NumberOfVisitors],[TempPass],[Role])VALUES(@ResidentAccountNumber,@ResidentName,@ResidentAddress,@NumberOfVisitors,(select cast((Abs(Checksum(NewId()))%10) as varchar(1)) + char(ascii('a')+(Abs(Checksum(NewId()))%25)) + char(ascii('A')+(Abs(Checksum(NewId()))%25)) + left(newid(),5)),'resident')";
cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection;
SqlParameter ResidentAccountNumber = new SqlParameter();
ResidentAccountNumber.ParameterName = "@ResidentAccountNumber";
ResidentAccountNumber.Value = txtboxResidenetAccountNumber.Text.Trim();
cmd.Parameters.Add(ResidentAccountNumber);
SqlParameter ResidentName = new SqlParameter();
ResidentName.ParameterName = "@ResidentName";
ResidentName.Value = txtboxResidentName.Text.Trim();
cmd.Parameters.Add(ResidentName);
SqlParameter ResidentAddress = new SqlParameter();
ResidentAddress.ParameterName = "@ResidentAddress";
ResidentAddress.Value = txtboxResidentAddress.Text.Trim();
cmd.Parameters.Add(ResidentAddress);
SqlParameter NumberOfVisitors = new SqlParameter();
NumberOfVisitors.ParameterName = "@NumberofVisitors";
NumberOfVisitors.Value = txtboxNumberOfVisitors.Text.Trim();
cmd.Parameters.Add(NumberOfVisitors);
try
{
sqlConnection.Open();
result = (string)cmd.ExecuteScalar();
sqlConnection.Close();
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}
protected void btnCreateResident_Click(object sender, EventArgs e)
{
txtboxTempPassword.Text = CreateResident();
}
答案 0 :(得分:0)
你的SQL错了,你遇到了很多问题,但我想告诉你一种让你的代码更具可读性的方法。格式如下:
cmd.CommandText = @"INSERT INTO [dbo].[NewUsers] ([ResidentAccountNumber],[ResidentName],[ResidentAddress], NumberOfVisitors],[TempPass], Role])
VALUES(
@ResidentAccountNumber,
@ResidentName,
@ResidentAddress,
@NumberOfVisitors,
(select cast((Abs(Checksum(NewId()))%10) as varchar(1)) + char(ascii('a')+(Abs(Checksum(NewId()))%25)) + char(ascii('A')+(Abs(Checksum(NewId()))%25)) + left(newid(),5)),
'resident')";
cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection;
我们知道VALUES构造函数中的select不合法,因此这是一个问题。
还有一个没有来自的SELECT似乎很奇怪 - 你是否正确复制了代码?
您正在使用ExecuteScalar - 您知道它的作用吗?它不应该包含一个包含INSERT查询的查询。
我猜你可能想要一个存储过程。
答案 1 :(得分:0)
我建议不要在C#代码中编写查询,必须使用存储过程来实现相同的目的。 如果您希望查询返回一些id,主键或某些值,则必须在插入查询后为其编写查询。 如果要从表中返回id,可以在选择查询中使用以下关键字。
SCOPE_IDENTITY
返回插入同一范围内IDENTITY列的最后一个IDENTITY值。
IDENT_CURRENT
返回在任何会话和任何范围内为特定表生成的最后一个标识值。
@@IDENTITY
返回在所有范围内为当前会话中的任何表生成的最后一个标识值。
如果您只想返回一条记录,请使用ExecuteScalar
,否则您可以使用ExecuteReader
。
如果您的唯一目的是将数据插入表中,那么您应该使用ExecuteNonQuery
。
答案 2 :(得分:0)
在评论的帮助下,我选择ExecuteReader
代替ExecuteScaler
。并更改了语句以返回值
INSERT INTO [table] ([fields]) OUTPUT Inserted.MyColumn VALUES(values)
C#代码:
reader = cmd.ExecuteReader();
try
{
while (reader.Read())
{
result = reader[0].ToString();
}
}
catch (Exception ex)
{
result = ex.Message;
}
return result;