簡體   English   中英

使用C#將數據編輯到SQL中

[英]Editing data into SQL with C#

我有這種用於編輯數據的方法,但是我不知道如何編寫代碼...直到現在,我仍然沒有真正理解這一點,並且其中有一個錯誤。 incorrect syntax near '('說不incorrect syntax near '('

        public void EditMember(Member member)
        {
            string Name = member.Name;
            string Surname = member.Surname;
            string EntryDate = member.EntryDate.ToString("dd.MM.yyyy");
            string Status = member.Status;

            sqlConnection.Open();
            sqlCommand = new SqlCommand(
                "UPDATE Members SET (Name, Surname, EntryDate) VALUES('" + Name + "','" + Surname + "','" + EntryDate + "')' WHERE'(' Id '='" + member.Id + "')",
                sqlConnection);
            sqlCommand.ExecuteNonQuery();
            sqlConnection.Close();
        }

問題是當我開始寫WHERE

請幫助。

請閱讀所有答案,而不僅僅是第一部分

這里有多個問題。 直接的問題在這里:

"')' WHERE'('

就像您要引用括號一樣。 該“應該”為:

"') WHERE ('

到那時,它看起來像是一個有效(但很糟糕)的INSERT命令……但是您使用的VALUES看起來無論如何都不是T-SQL中進行更新的有效方法。

但是,您根本不應該使用這種方法。 它容易出錯,難以閱讀,最重要的是容易受到SQL注入攻擊

相反,您應該使用參數化的SQL:

string sql = @"UPDATE Members
               SET Name = @Name, Surname = @Surname, EntryDate = @EntryDate
               WHERE Id = @Id";

using (var connection = new SqlConnection(...))
{
    connection.Open();
    using (var command = new SqlCommand(sql, connection))
    {
        command.Parameters.Add("@Name", SqlDbType.NVarChar).Value = member.Name;
        command.Parameters.Add("@Surname", SqlDbType.NVarChar).Value = member.Surname;
        command.Parameters.Add("@EntryDate", SqlDbType.DateTime).Value = member.EntryDate;
        command.Parameters.Add("@Id", SqlDbType.NVarChar).Value = member.Id;
        int rows = command.ExecuteNonQuery();
        // TODO: Work out what to do if rows isn't 1
    }
}

(當然,需要對適當的數據類型進行調整。)

更新語句的正確語法是

  "UPDATE Members SET Name = @name, Surname = @surname, EntryDate = @date WHERE id=@id"

也就是說,您應該使用像這樣的參數化查詢

    public void EditMember(Member member)
    {
        string Name = member.Name;
        string Surname = member.Surname;
        string EntryDate = member.EntryDate.ToString("dd.MM.yyyy");
        string Status = member.Status;

        sqlConnection.Open();
        sqlCommand = new SqlCommand("UPDATE Members SET Name = @name, Surname = @surname, " + 
                         "EntryDate = @date " + 
                         "WHERE Id = @id", sqlConnection);
        sqlCommand.Parameters.AddWithValue("@name", Name);
        sqlCommand.Parameters.AddWithValue("@surname", Surname);
        sqlCommand.Parameters.AddWithValue("@date", EntryDate);
        sqlCommand.Parameters.AddWithValue("@id", Status);
        sqlCommand.ExecuteNonQuery();
        sqlConnection.Close();

附帶說明一下,請記住,AddWithValue是向查詢添加參數的一種簡單方法,但是如果此查詢的性能至關重要,則最好使用完全定義的參數,並將其數據類型與數據庫列的類型完全匹配,並且與確切的大小。

永遠不要將用戶輸入的SQL語句連接在一起。

相反:使用參數化查詢 -它們易於使用,避免SQL注入並提高性能。

嘗試編寫如下代碼:

string updateStmt = "UPDATE dbo.Members SET Name = @Name, Surname = @Surname, EntryDate = @EntryDate WHERE Id = @ID";

sqlCommand = new SqlCommand(updateStmt, sqlConnection);

sqlCommand.Parameters.Add("@Name", SqlDbType.VarChar, 100).Value = name;
sqlCommand.Parameters.Add("@Surname", SqlDbType.VarChar, 100).Value = surname;
sqlCommand.Parameters.Add("@EntryDate", SqlDbType.DateTime).Value = entrydate;
sqlCommand.Parameters.Add("@ID", SqlDbType.Int).Value = member.Id;

sqlConnection.Open();
sqlCommand.ExecuteNonQuery();
sqlConnection.Close();

WHERE周圍刪除引號,就可以了。 請注意有關SQL注入攻擊的注釋中給出的警告。

您的代碼包含用於更新的語法錯誤以及SQLInjection問題。

您需要傳遞參數來更新查詢,而不是傳遞直接值。

應該如下:

public void EditMember(Member member)
{
    string Name = member.Name;
    string Surname = member.Surname;
    string EntryDate = member.EntryDate.ToString("dd.MM.yyyy");
    string Status = member.Status;

    sqlConnection.Open();
    sqlCommand = new SqlCommand("UPDATE Members SET Name=@Name, Surname=@Sirname, EntryDate=@EntryDate WHERE Id = @id", sqlConnection);
    sqlCommand.parameters.AddparameterWithValue("@Name",Name);
    sqlCommand.parameters.AddparameterWithValue("@Surname",Surname);
    sqlCommand.parameters.AddparameterWithValue("@EntryDate",EntryDate);
    sqlCommand.parameters.AddparameterWithValue("@Id",Id);
    sqlCommand.ExecuteNonQuery();
    sqlConnection.Close();
}

編輯帖子以做出正確答案:

即,您在where子句中不需要括號。 是的,更好的查詢是

  "UPDATE Members SET Name=@Name, Surname=@Surname, EntryDate=@EntryDate WHERE  Id=@ID" 

然后通過命令對象的參數添加@ Name,@ Surname等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM