Errore sql del nome della colonna non valido

Sto cercando di inserire dati nel mio database, ma mi sta dando il seguente errore:

Nome colonna non valido

Ecco il mio codice

string connectionString = "Persist Security Info=False;User ID=sa;Password=123;Initial Catalog=AddressBook;Server=Bilal-PC"; using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand cmd = new SqlCommand(); cmd.CommandText = "INSERT INTO Data (Name,PhoneNo,Address) VALUES (" + txtName.Text + "," + txtPhone.Text + "," + txtAddress.Text + ");"; cmd.CommandType = CommandType.Text; cmd.Connection = connection; connection.Open(); cmd.ExecuteNonQuery(); } 

Cerca sempre di usare la query sql parametrizzata per tenerti al sicuro da eventi dannosi, in modo da poter riorganizzare il codice come di seguito:

Assicurarsi inoltre che la tabella abbia le corrispondenze del nome della colonna su Name , PhoneNo , Address .

 using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand cmd = new SqlCommand("INSERT INTO Data (Name, PhoneNo, Address) VALUES (@Name, @PhoneNo, @Address)"); cmd.CommandType = CommandType.Text; cmd.Connection = connection; cmd.Parameters.AddWithValue("@Name", txtName.Text); cmd.Parameters.AddWithValue("@PhoneNo", txtPhone.Text); cmd.Parameters.AddWithValue("@Address", txtAddress.Text); connection.Open(); cmd.ExecuteNonQuery(); } 

Probabilmente hai bisogno di virgolette attorno a quei campi stringa, ma dovresti usare query parametrizzate!

 cmd.CommandText = "INSERT INTO Data ([Name],PhoneNo,Address) VALUES (@name, @phone, @address)"; cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@name", txtName.Text); cmd.Parameters.AddWithValue("@phone", txtPhone.Text); cmd.Parameters.AddWithValue("@address", txtAddress.Text); cmd.Connection = connection; 

Per inciso, la tua query originale avrebbe potuto essere risolta in questo modo (nota le virgolette singole):

 "VALUES ('" + txtName.Text + "','" + txtPhone.Text + "','" + txtAddress.Text + "');"; 

ma ciò avrebbe reso vulnerabile agli attacchi SQL Injection da quando un utente poteva digitare

 '; drop table users; -- 

in una delle tue caselle di testo. O, più banalmente, il povero Daniel O’Reilly potrebbe rompere la tua richiesta ogni volta.

Cambia questa linea:

 cmd.CommandText = "INSERT INTO Data (Name,PhoneNo,Address) VALUES (" + txtName.Text + "," + txtPhone.Text + "," + txtAddress.Text + ");"; 

a questa:

 cmd.CommandText = "INSERT INTO Data (Name,PhoneNo,Address) VALUES ('" + txtName.Text + "','" + txtPhone.Text + "','" + txtAddress.Text + "');"; 

Il comando di inserimento è in attesa di testo e sono necessarie virgolette singole (‘) tra il valore effettivo in modo che SQL possa comprenderlo come testo.

EDIT : Per quelli di voi che non sono contenti di questa risposta, vorrei sottolineare che c’è un problema con questo codice per quanto riguarda SQL Injection. Quando ho risposto a questa domanda, ho preso in considerazione solo la domanda in questione, che era la citazione singola mancante sul suo codice e ho fatto notare come risolverlo. Una risposta molto migliore è stata pubblicata da Adam (e ho votato a favore), in cui spiega i problemi con l’iniezione e mostra un modo per prevenire. Adesso rilassati e sii felice ragazzi.

Il tuo problema è che la tua stringa non è quotata. Il che significa che sono interpretati dal tuo motore di database come un nome di colonna.

È necessario creare parametri per passare il valore alla query.

  cmd.CommandText = "INSERT INTO Data (Name, PhoneNo, Address) VALUES (@Name, @PhoneNo, @Address);"; cmd.Parameters.AddWithValue("@Name", txtName.Text); cmd.Parameters.AddWithValue("@PhoneNo", txtPhone.Text); cmd.Parameters.AddWithValue("@Address", txtAddress.Text); 

Non dovresti mai scrivere codice che concatena SQL e parametri come stringa – questo apre il tuo codice all’iniezione SQL che è un serio problema di sicurezza.

Usa param bind – per un bel howto vedere qui …

Codice Per inserire dati in Access Db utilizzando c #

Codice:-

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace access_db_csharp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public SqlConnection con = new SqlConnection(@"Place Your connection string"); private void Savebutton_Click(object sender, EventArgs e) { SqlCommand cmd = new SqlCommand("insert into Data (Name,PhoneNo,Address) values(@parameter1,@parameter2,@parameter3)",con); cmd.Parameters.AddWithValue("@parameter1", (textBox1.Text)); cmd.Parameters.AddWithValue("@parameter2", textBox2.Text); cmd.Parameters.AddWithValue("@parameter3", (textBox4.Text)); cmd.ExecuteNonQuery(); } private void Form1_Load(object sender, EventArgs e) { con.ConnectionString = connectionstring; con.Open(); } } 

}

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Data.SqlClient; using System.Data; namespace WpfApplication1 { ///  /// Interaction logic for MainWindow.xaml ///  public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void btnAdd_Click(object sender, RoutedEventArgs e) { SqlConnection conn = new SqlConnection(@"Data Source=WKS09\SQLEXPRESS;Initial Catalog = StudentManagementSystem;Integrated Security=True"); SqlCommand insert = new SqlCommand("insert into dbo.StudentRegistration(ID, Name,Age,DateOfBirth,Email,Comment) values(@ID, @Name,@Age,@DateOfBirth,@mail,@comment)", conn); insert.Parameters.AddWithValue("@ID", textBox1.Text); insert.Parameters.AddWithValue("@Name", textBox2.Text); insert.Parameters.AddWithValue("@Age", textBox3.Text); insert.Parameters.AddWithValue("@DateOfBirth", textBox4.Text); insert.Parameters.AddWithValue("@mail", textBox5.Text); insert.Parameters.AddWithValue("@comment", textBox6.Text); if (textBox1.Text == string.Empty) { MessageBox.Show("ID Cannot be Null"); return; } else if (textBox2.Text == string.Empty) { MessageBox.Show("Name Cannot be Null"); return; } try { conn.Open(); insert.ExecuteNonQuery(); MessageBox.Show("Register done !"); } catch (Exception ex) { MessageBox.Show("Error" + ex.Message); conn.Close(); } } private void btnRetrive_Click(object sender, RoutedEventArgs e) { bool temp = false; SqlConnection con = new SqlConnection("server=WKS09\\SQLEXPRESS;database=StudentManagementSystem;Trusted_Connection=True"); con.Open(); SqlCommand cmd = new SqlCommand("select * from dbo.StudentRegistration where ID = '" + textBox1.Text.Trim() + "'", con); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { textBox2.Text = dr.GetString(1); textBox3.Text = dr.GetInt32(2).ToString(); textBox4.Text = dr.GetDateTime(3).ToString(); textBox5.Text = dr.GetString(4); textBox6.Text = dr.GetString(5); temp = true; } if (temp == false) MessageBox.Show("not found"); con.Close(); } private void btnClear_Click(object sender, RoutedEventArgs e) { SqlConnection connection = new SqlConnection("Data Source=WKS09\\SQLEXPRESS;Initial Catalog = StudentManagementSystem;Integrated Security=True"); string sqlStatement = "DELETE FROM dbo.StudentRegistration WHERE ID = @ID"; try { connection.Open(); SqlCommand cmd = new SqlCommand(sqlStatement, connection); cmd.Parameters.AddWithValue("@ID", textBox1.Text); cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); MessageBox.Show("Done"); } finally { Clear(); connection.Close(); } } public void Clear() { textBox1.Text = ""; textBox2.Text = ""; textBox3.Text = ""; textBox4.Text = ""; } } } 

Devi usare '"+texbox1.Text+"','"+texbox2.Text+"','"+texbox3.Text+"'

Invece di "+texbox1.Text+","+texbox2.Text+","+texbox3.Text+"

Notare le virgolette singole in più.

innanzitutto creare il nome del database “Scuola” piuttosto che creare una tabella “studenti” con le seguenti colonne 1. id 2. nome 3. indirizzo

ora apri Visual Studio e crea una connessione:

  scuola dello spazio dei nomi
 {
     Classe pubblica parziale Form1: Form
     {
         SqlConnection scon;


         public Form1 ()
         {

             InitializeComponent ();

             scon = new SqlConnection ("Origine dati = ABC-PC; trusted_connection = yes; Database = school; timeout connessione = 30");
         }

 // crea il comando

 SqlCommand scom = new SqlCommand ("inserisci nei valori studenti (id, nome, indirizzo) (@ id, @ nome, @ indirizzo)", scon);

 // passa i parametri

 scom.Parameters.Add ("id", SqlDbType.Int);
 scom.Parameters ["id"]. Value = textBox1.Text;

            scom.Parameters.Add ("nome", SqlDbType.VarChar);
             scom.Parameters ["nome"]. Valore = this.textBox2.Text;

             scom.Parameters.Add ("address", SqlDbType.VarChar);
             scom.Parameters ["indirizzo"]. Valore = this.textBox6.Text;


             scon.Open ();
             scom.ExecuteNonQuery ();
             scon.Close ();
             reset();

         } 

controlla anche la soluzione qui: http://solutions.musanitech.com/?p=6

Il tuo problema sembra essere la parola chiave Name. Piuttosto usa FullName o firstName e lastName, cerca sempre di ricordarti di usare anche CamelCase.

 con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Yna Maningding-Dula\Documents\Visual Studio 2010\Projects\LuxuryHotel\LuxuryHotel\ClientsRecords.mdf;Integrated Security=True;User Instance=True"); con.Open(); cmd = new SqlCommand("INSERT INTO ClientData ([Last Name], [First Name], [Middle Name], Address, [Email Address], [Contact Number], Nationality, [Arrival Date], [Check-out Date], [Room Type], [Daily Rate], [No of Guests], [No of Rooms]) VALUES (@[Last Name], @[First Name], @[Middle Name], @Address, @[Email Address], @[Contact Number], @Nationality, @[Arrival Date], @[Check-out Date], @[Room Type], @[Daily Rate], @[No of Guests], @[No of Rooms]", con); cmd.Parameters.Add("@[Last Name]", txtLName.Text); cmd.Parameters.Add("@[First Name]", txtFName.Text); cmd.Parameters.Add("@[Middle Name]", txtMName.Text); cmd.Parameters.Add("@Address", txtAdd.Text); cmd.Parameters.Add("@[Email Address]", txtEmail.Text); cmd.Parameters.Add("@[Contact Number]", txtNumber.Text); cmd.Parameters.Add("@Nationality", txtNational.Text); cmd.Parameters.Add("@[Arrival Date]", txtArrive.Text); cmd.Parameters.Add("@[Check-out Date]", txtOut.Text); cmd.Parameters.Add("@[Room Type]", txtType.Text); cmd.Parameters.Add("@[Daily Rate]", txtRate.Text); cmd.Parameters.Add("@[No of Guests]", txtGuest.Text); cmd.Parameters.Add("@[No of Rooms]", txtRoom.Text); cmd.ExecuteNonQuery();