2016-11-10 54 views
0

我正在用函数的返回值填充文本框,但如果我在函数内部运行sql代码,它不起作用。我可以删除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

你的意思是在一个函数内?你在哪里得到错误,什么错误? –

+0

你需要SqlDataReader来读取结果 –

回答

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是不合法的,所以这是一个问题。

还有一个没有从一个选择似乎很奇怪 - 你是否正确地复制你的代码?

您正在使用ExecuteScalar - 你知道那是什么吗?它不应该包含包含INSERT查询的查询。

我猜你可能想要一个存储过程。

+0

谢谢。不幸的是,我不知道这意味着什么。我一直在使用datareader(切换到解决这个问题,缩放比例是我正在跟踪的例子) – birddseedd

0

我建议不要在C#代码中编写查询,您必须使用存储过程来达到同样的目的。 如果你想让你的查询返回一些id,主键或某个值,那么你必须在插入查询后为它写回查询。 如果您想从表中返回id,则可以在选择查询中使用以下关键字。

SCOPE_IDENTITY返回插入同一范围内的IDENTITY列的最后一个IDENTITY值。

IDENT_CURRENT返回为任何会话和任何范围中的特定表生成的最后一个标识值。

@@IDENTITY返回当前会话中任何表的最后一个标识值,跨所有范围。

如果您只想返回一条记录,请使用ExecuteScalar,否则您可以使用ExecuteReader

如果您的唯一目的是将数据插入表中,那么您应该使用ExecuteNonQuery

+0

切换到执行读取器,并在查询中使用OUTPUT给我想要的结果 – birddseedd

+0

更新你的问题的答案 –

+0

@ viveknuna - 用答案更新问题并不是真的如何运作。 – Hogan

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;