2016-11-10 1 views
0

Ich bin ein Textfeld mit dem Rückgabewert einer Funktion bevölkern, aber es funktioniert nicht, wenn ich den SQL-Code innerhalb der Funktion ausgeführt werden. Ich kann den SQL-Code entfernen und es funktioniert. also bin ich ratlos.Return on meiner Funktion funktioniert nicht, wenn SQL mit

Und mit „funktioniert nicht“ ich meine, dass das Textfeld wird mit etwas nie aufgefüllt. es bleibt leer.

dank

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

Sie eine Ausnahme erhalten Sie? –

+0

Was meinst du in einer Funktion? wo Sie den Fehler erhalten, und welcher Fehler ist? –

+0

müssen Sie SqlDataReader, um das Ergebnis zu lesen –

Antwort

0

Ihre SQL ist falsch, und Sie haben eine Menge Probleme, aber ich möchte Ihnen einen Weg zeigen Sie Ihren Code besser lesbar zu machen. Formatieren Sie es wie folgt aus:

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; 

Wir wissen, dass eine Auswahl in einer VALUES-Konstruktor nicht legal ist, so dass ein Problem.

Auch ein SELECT ohne eine von aus scheint seltsam - haben Sie Ihren Code richtig kopiert?

Sie verwenden ExecuteScalar - wissen Sie, was das bedeutet? Es sollte keine Abfrage enthalten, die eine INSERT-Abfrage enthält.

Ich vermute, Sie möchten wahrscheinlich eine gespeicherte Prozedur.

+0

danke. leider weiß ich nicht was es bedeutet. Ich benutze den Datenleser (geschaltet, um dieses Problem zu lösen. Der Scaler ist nur das Beispiel, das ich folgte. – birddseedd

0

Ich würde vorschlagen, nicht schreiben Abfrage in Code C# müssen Sie Verfahren für den gleichen Zweck zur Verwendung gelagert. Wenn Sie möchten, dass Ihre Abfrage eine ID, einen Primärschlüssel oder einen Wert zurückgibt, müssen Sie nach der Einfügeabfrage eine Abfrage dafür schreiben. Sie können die folgenden Schlüsselwörter in Ihrer Select-Abfrage verwenden, wenn Sie die ID aus der Tabelle zurückgeben möchten.

SCOPE_IDENTITY gibt den letzten IDENTITY-Wert zurück, der in eine IDENTITY-Spalte im selben Bereich eingefügt wurde.

IDENT_CURRENT gibt den letzten Identitätswert zurück, der für eine bestimmte Tabelle in einer Sitzung und einem beliebigen Bereich generiert wurde.

@@IDENTITY gibt den letzten Identitätswert für jede Tabelle in der aktuellen Sitzung erzeugt, in allen Bereichen.

Wenn Sie nur einen Datensatz zurückgeben möchten, verwenden Sie ExecuteScalar, andernfalls können Sie ExecuteReader verwenden.

Wenn Ihr einziger Zweck ist es, Daten in die Tabelle einfügen, dann sollten Sie ExecuteNonQuery verwenden.

+0

Wechsel zum executeReader und Verwendung von OUTPUT in der Abfrage gab das Ergebnis, das ich suchte. – birddseedd

+0

aktualisieren Sie Ihre Frage mit der Antwort –

+0

@ viveknuna - Aktualisieren der Frage mit der Antwort ist nicht wirklich, wie SO funktioniert. – Hogan

0

Mit Hilfe von Kommentaren ging ich mit ExecuteReader anstelle der ExecuteScaler. Und änderte die Anweisung ein Wert

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

C# -Code zurückzukehren:

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

    return result;