2016-11-10 45 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;