如果使用sql,返回我的功能并不起作用

时间:2016-11-10 19:11:11

标签: c# sql asp.net

我正在使用函数的返回值填充文本框,但如果我在函数内部运行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();
}

3 个答案:

答案 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;