简体   繁体   English

如果使用SQL,返回我的函数将不起作用

[英]Return on my function doesn't work if using sql

I am populating a text box with the returned value of a function, but it doesn't work if I run the sql code inside the function. 我正在用函数的返回值填充文本框,但是如果我在函数内运行sql代码,它将无法正常工作。 I can remove the sql related code and it works. 我可以删除与sql相关的代码,并且可以正常工作。 so i'm stumped. 所以我很困惑。

And by "doesn't work" i mean that the text box never gets populated with anything. 所谓“无效”,是指文本框永远不会填充任何东西。 it remains blank. 它保持空白。

thanks 谢谢

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();
}

Your SQL is wrong and you have a lot of problems but I want to show you a way to make your code more readable. 您的SQL错误并且存在很多问题,但我想向您展示一种使代码更具可读性的方法。 Format it like this: 格式化如下:

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;

We know that a select in a VALUES constructor is not legal so that is one problem. 我们知道,在VALUES构造函数中进行选择是不合法的,因此这是一个问题。

Also having a SELECT without a from seems strange -- did you copy your code correctly? 也有没有from的SELECT似乎很奇怪-您是否正确复制了代码?

You are using ExecuteScalar -- do you know what that does? 您正在使用ExecuteScalar-您知道那是什么吗? It shouldn't include a query that includes INSERT query. 它不应该包含包含INSERT查询的查询。

I'm guessing you probably want a stored procedure. 我猜你可能想要一个存储过程。

I would suggest do not write query in C# code, you must use Stored Procedure for the same purpose. 我建议不要用C#代码编写查询,出于相同的目的,必须使用存储过程。 If you want your query to return some id, primary key or some value then you must write query for that after your insert query. 如果要查询返回一些ID,主键或某个值,则必须在插入查询之后为此写查询。 you can use the following keywords in your select query,if you want to return id from table. 如果要从表中返回ID,则可以在选择查询中使用以下关键字。

SCOPE_IDENTITY returns the last IDENTITY value inserted into an IDENTITY column in the same scope. SCOPE_IDENTITY返回插入到同一作用域的IDENTITY列中的最后一个IDENTITY值。

IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope. IDENT_CURRENT返回为任何会话和任何作用域中的特定表生成的最后一个标识值。

@@IDENTITY returns the last identity value generated for any table in the current session, across all scopes. @@IDENTITY返回在所有范围内为当前会话中的任何表生成的最后一个标识值。

If you want to return only one record then use ExecuteScalar else you can use ExecuteReader . 如果只想返回一条记录,请使用ExecuteScalar否则可以使用ExecuteReader

If your only purpose is to insert data into the table then you should use ExecuteNonQuery . 如果您的唯一目的是将数据插入表中,则应使用ExecuteNonQuery

With the help of comments I went with ExecuteReader instead of the ExecuteScaler . 借助注释,我选择了ExecuteReader而不是ExecuteScaler And changed the statement to return a value 并更改语句以返回值

INSERT INTO [table] ([fields]) OUTPUT Inserted.MyColumn VALUES(values)

C# Code: C#代码:

    reader = cmd.ExecuteReader();
    try
    {
        while (reader.Read())
        {
            result = reader[0].ToString();
        }
    }
    catch (Exception ex)
    {
        result = ex.Message;
    }

    return result;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM