Ich möchte einige Daten in eine Datenbank einfügen, die die einzufügenden Informationen aus dem von mir erstellten Formular abruft. Ich benutze den folgenden Befehl:

String query = @"INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting) VALUES( " 
                + NameBox.Text.Split(null)[0]+ " , " 
                + SurnameBox.Text.Split(null)[0] + " , " 
                + type + " , " 
                + Convert.ToDouble(idNBox.Text) + " , " 
                + gender + "," + Companybox.Text + " , "
                + delivery + " , " + DateTime.Now + " ," 
                + VisitingCombo.Text 
                + " )";

Die Tabelle wurde mit der folgenden Struktur erstellt:

CREATE TABLE [dbo].[Visits] (
[Name]     NVARCHAR (50) NOT NULL,
[Surname]  NVARCHAR (50) NOT NULL,
[DocType]  NVARCHAR (50) NOT NULL,
[IdNumber] BIGINT NOT NULL,
[Gender]   NCHAR (1)     NOT NULL,
[Company]  NVARCHAR (50) NOT NULL,
[Delivery] BIT           NOT NULL,
[Entrance] DATE          NOT NULL,
[Out]      DATE          NULL,
[Visting]  NVARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([IdNumber] ASC, [DocType] ASC, [Entrance] ASC),
FOREIGN KEY ([Visting]) REFERENCES [dbo].[Person] ([Name]));

Beim Ausführen des Codes versuche ich den folgenden Fehler einzufügen:

System.Data.SqlClient.SqlException: 'Falsche Syntax in der Nähe von', '.'

Für das Einfügen habe ich einen Code verwendet, den ich in einer Antwort von Nicholas Carey gefunden habe, der mein Problem lösen könnte. Direkte Ausführung SQL-Abfrage in C #? Haben Sie Beispiel Batch-Datei

Ich weiß, dass der Fehler im allerersten Wert der Abfrage auftritt. Was mache ich hier falsch?

0
André Filipe Ferreira 18 Apr. 2018 im 13:10

6 Antworten

Beste Antwort

Sie sollten keine Zeichenfolgenverkettung für die Erstellung von SQL-Abfragen verwenden, insbesondere wenn diese teilweise von Benutzereingaben empfangen wird. Bitte beachten Sie den SQL Injection -Angriff.

Verwenden Sie stattdessen die parametrisierte Abfrage:

var cmd = new SqlCommand(@"INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting)
VALUES(@Name,@Surname,@DocType,@DocNumber,@Gender,@Company,@Delivery,@Entrance,@Visiting)", yourDbConnection);

cmd.Parameters.Add(new SqlParameter("@Name", NameBox.Text.Split(null)[0]));
//... Add other parameters in the same way

cmd.ExecuteNonQuery();

PS: Bei Ihrem direkten Problem fehlen wahrscheinlich Anführungszeichen um Zeichenfolgenwerte, aber verketten Sie das auf keinen Fall!

1
Sasha 18 Apr. 2018 im 10:22

Es ist eine sehr schlechte Lösung.

Es kann hack sein.

Es ist besser, ADO.NET zu verwenden

 using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionCS"].ConnectionString))
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting) VALUES(@Name,@Surname,@DocType,@DocNumber,@Gender,@Company,@Delivery,@Entrance,@Visiting)");
        using (SqlCommand com = new SqlCommand(sb.ToString(), con))
        {
            con.Open();
            com.Parameters.Add("@Name", SqlDbType.NVarChar).Value = NameBox.Text.Split(null)[0];
            //Add Other Parameter
            //...
            com.ExecuteScalar();
        }
    }
1
mhsankar 18 Apr. 2018 im 10:17

Kurze Antwort

In Ihrer Abfrage haben Sie es versäumt, die Zeichenfolgenwerte (varchar) in Anführungszeichen ' zu setzen.

Beispiel:

String query = @"INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting) VALUES( " 
               + "'" + NameBox.Text.Split(null)[0]+ "' , " 

Bessere Antwort:

Sie fragen unter SQL-Injection-Angriff und Wartbarkeitsproblem. Sie sollten in Betracht ziehen, Ihre Abfrage zu parametrisieren, um sie zu vermeiden.

Beispiel:

String query = @"INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting) VALUES( " 
               + "@Name, " ...

command.Parameters.Add("@Name", SqlDbType.NVarChar).Value = NameBox.Text; 

Die verbleibenden Parameter können Sie üben und lernen.

1
Sunil 18 Apr. 2018 im 10:20

Ich würde vorschlagen, dass Sie überprüfen, ob die Anführungszeichen korrekt sind oder kein einfaches Anführungszeichen in doppeltem Anführungszeichen verwenden, einen Debugger auf die String-Abfragevariable setzen und dann überprüfen, was die Variable enthält, ob sie eine richtige Abfrage hat oder nicht, und gemäß dem Fehler ändern im variablen Wert

0
imdisney 18 Apr. 2018 im 10:24

Lange Abfragen werden sehr schnell sehr chaotisch. Wie Oleksandr sagte, ist die Art und Weise, wie Sie Informationen an eine INSERT-Abfrage übergeben, ziemlich gefährlich. Versuchen Sie so etwas:

string query = "INSERT INTO Visits(Name,Surname,DocType,DocNumber,Gender,Company,Delivery,Entrance,Visiting) VALUES(@name, @surname, @docType, @docNumber, @gender, @company, @delivery, @entrance, @visiting)";
string param = new {@name = NameBox.Text, @surname = SurnameBox.Text, ... @visiting = VisitingCombo.Text};

Dies bedeutet, dass alle Informationen, die an Ihre Datenbank übergeben werden, als Zeichenfolge übergeben werden, anstatt dass jemand unerwünschte SQL-Abfragen weiterleiten kann.

Der Grund, warum Sie eine Syntaxausnahme erhalten haben, ist höchstwahrscheinlich, dass Sie, wenn Sie geraden Text an eine Abfrage übergeben, diesen in 'einfache Anführungszeichen' einschließen müssen.

Durch die Paramaterisierung Ihrer Eingabe werden Sie sowohl vor SQL Injection / Poisoning geschützt als auch Probleme im Zusammenhang mit der Datentypdeklaration in Ihrer Abfrage vermieden.

0
ddaannnnyy 18 Apr. 2018 im 10:25

Bitte verwenden Sie die gespeicherte Prozedur , um diese Art von Fehler zu beheben. Es ist auch schnell beim Speichern der Daten in der Datenbank.

0
pankaj singh 18 Apr. 2018 im 10:42