none
C# SQL Server (System.Data.OleDb.OleDbException "Üngültige Autorisierungsangabe Ungültiges Attribut für die Verbindungszeichenfolge) RRS feed

  • Frage

  • Hallo,

    Habe ein Problem mit c#und zwar bin ich von einer Access Datenbank auf eine SQl datenbank umgestiegen und die Verbindungszeichenfolge stimmt nichtmehr oder visual studio nimmt Sie nicht an, hab schon im Internet geschaut und so müsste Sie ausschauen.:

    "Provider=SQLOLEDB;Data Source=Your_Server_Name; Initial Catalog= Your_Database_Name; UserId=Your_Username; Password=Your_Password;

    Vielleicht habe ich nur einen kleinen Fehler.:

     OleDbConnection con = new OleDbConnection("Provider=SQLOLEDB;Data Source=/Pia710/SQL_LVerwaltung;Initial Catalog=LagerverwaltungPIA;UserId=XXX;Password=XXX;");
                OleDbDataAdapter oda = new OleDbDataAdapter("Select Role from [Customers] Where FullName ='"+txtBN.Text+"' and Password='"+txtPW.Text+"'      ",con);
    
    
                DataTable dt = new System.Data.DataTable();
                oda.Fill(dt);
                if (dt.Rows[0][0].ToString() == "Admin")
                {
                    rabool = true;
                    NeuerBenutzer NB = new NeuerBenutzer();
                    this.Hide();
                    NB.Show();
                    Rolle = "Admin";

    Mit freundlichen Gruß

    Pascal Zentek

    Mittwoch, 2. Mai 2018 13:31

Antworten

  •             if (dt.Rows.ToString() == "Admin")
                ...
                else if (dt.Rows[0][0].ToString() == "Anleiter")
                

    Hallo Pascal,

    wie kann der Inhalt eines ganzen Row Objektes = "Admin" sein, da ist die zweite Variante mit dem Indexer auf Zeile & Spalte richtiger.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Pascal_1991 Montag, 14. Mai 2018 13:04
    Donnerstag, 3. Mai 2018 12:19
  • Hallo Pascal,

    was sollte "dt" auch beinhalten. Wenn Du dir die Variable "dt" ausgeben lässt, kommt maximal der Name der DataTable dabei raus, sonst nichts.

    Die Inhalte siehst Du erst über die Rows und Columns.

    "Admin" wird in der DataTable selbst durch deinen Code niemals stehen.

    Wenn Du nur einen einzelnen Wert auslesen willst, ist das aber der falsche Code. In dem Fall solltest Du eher <SqlCommand>.ExecuteScalar() mit Auslesen des Rückgabewerts ausführen. Also bspw. so:

    public String GetResult( SqlConnection _connection, String _sqlStatement )
    {
        String result;
    
        SqlCommand command = new SqlCommand();
        command.Connection   = _connection;
        command.CommandText  = _sqlStatement;
        command.CommandType  = CommandType.Text;
    
        result = command.ExecuteScalar().ToString();
    
        command.Dispose();
    
        return result;
    }

    Aufruf dann bspw. so:

    String sql  = "Select Role from [Customers] Where FullName ='" + txtBN.Text + "' and Password='" + txtPW.Text + "'";
    String role = this.GetResult( conn, sql );

    Die Stringverkettung und Integration von Variablen in das SQL Statement ist aber so ziemlich die schlechteste Idee, die Du haben kannst. Verwende durchgehend Parameter Objekte, bei SQL Server SqlParameter um die Werte einzubinden.

    SqlConnection connection = new SqlConnection( "<ConnectionString>" );
    connection.Open();
    
    SqlCommand command  = new SqlCommand( "SELECT ... FROM ... WHERE Feld1 = @Wert1 AND Feld2 = @Wert2", connection );
    
    command.Parameters.AddWithValue( "@Wert1", TextBox1.Text );
    command.Parameters.AddWithValue( "@Wert2", TextBox2.Text );
    
    ...
    
    connection.Close();
    connection.Dispose();


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Freitag, 4. Mai 2018 08:46
    Moderator

Alle Antworten

  • OleDbConnection con = new OleDbConnection("Provider=SQLOLEDB;Data Source=/Pia710/SQL_LVerwaltung;...          

    Hallo Pascal,

    das Slash / vor dem Server Namen Pia810 gehört da nicht hin, der muss weg.

    BTW, warum nutzt Du OleDbClient und nicht den für den SQL Server optimierten SqlClient?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 2. Mai 2018 13:43
  • Bin noch relativ frisch im C# Gewerbe und habe den OleDb genutzt weil ich den vorher für eine Access Datenbank genutzt habe, bei der er auch funktionierte.

    Danke für deine Antwort Habe nun die sql version davon genomen nun schriebt er mir in der Datatable variable nichts rein ist überhaupt eine Verbindung vorhanden ? Jedenfalls meckert er da nicht.

           private void button1_Click(object sender, EventArgs e)// Mehrere Login Forms anlegen oder Eine Schleife  Catch Oder sowas
            {
     
                string sqlconnection =CustomerDatenbankPia.Properties.Settings.Default.LagerverwaltungPIAConnectionStringSQL; //liegt vileicht hier der fehler vor ?
                SqlConnection conn = new SqlConnection(sqlconnection);//bei manueller eingabe spuckt er mir fehler aus
                conn.Open();
                SqlDataAdapter sda = new SqlDataAdapter("Select Role from [Customers] Where FullName ='" + txtBN.Text + "' and Password='" + txtPW.Text + "'      ", conn);
                DataTable dt = new System.Data.DataTable();
                sda.Fill(dt); // Hier sollte er eigentlich Admin reinschreiben tut er aber nicht in der datenbank ist die rolle vorhanden und es steht admin drin
     
    
    
                MessageBox.Show(sqlconnection.ToString());
                if (dt.Rows.ToString() == "Admin")
                {
                    rabool = true;
                    NeuerBenutzer NB = new NeuerBenutzer();
                    this.Hide();
                    NB.Show();
                    Rolle = "Admin";
    
    
                    
    
    
                    
                    if (roleAdmin == txtBN.Text)//Testzwecke
                    {
                        rabool = true;
                    }
                    else
                    {
                        rabool = false;
                    }
                    
                }
                
                else if (dt.Rows[0][0].ToString() == "Anleiter")
                {
                    rabool = true;
                    NeuerBenutzer NB = new NeuerBenutzer();
                    this.Hide();
                    NB.Show();
                    Rolle = "Anleiter";
    
                }
                else if (dt.Rows[0][0].ToString() == "Lagermitarbeiter")
                {
                    rabool = false;
                    //Test rabool =false;
                    Form1 frm11 = new Form1();//testzwecke
                    frm11.Show();
                    Rolle = "Lagermitarbeiter";
    
    
    
                }
                else if (dt.Rows[0][0].ToString() == "Helfer")
                {
                    Rolle = "Helfer";
                }
                else
                {
                    MessageBox.Show("Kein Zugriff");
                }
                conn.Close();
    
    
            }

    Donnerstag, 3. Mai 2018 10:14
  •             if (dt.Rows.ToString() == "Admin")
                ...
                else if (dt.Rows[0][0].ToString() == "Anleiter")
                

    Hallo Pascal,

    wie kann der Inhalt eines ganzen Row Objektes = "Admin" sein, da ist die zweite Variante mit dem Indexer auf Zeile & Spalte richtiger.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Pascal_1991 Montag, 14. Mai 2018 13:04
    Donnerstag, 3. Mai 2018 12:19
  • Ja wohl wahr hab etwas rumprobiert löst aber nicht mein Problem habe "dt" ausgeben lassen und er gibt keinen Wert in dt spirch die Fill Funktion macht nicht das was Sie soll. Woran kann das Liegen ?

    Mit freundlichen Gruß

    Pascal zentek

    Freitag, 4. Mai 2018 08:10
  • Hallo Pascal,

    was sollte "dt" auch beinhalten. Wenn Du dir die Variable "dt" ausgeben lässt, kommt maximal der Name der DataTable dabei raus, sonst nichts.

    Die Inhalte siehst Du erst über die Rows und Columns.

    "Admin" wird in der DataTable selbst durch deinen Code niemals stehen.

    Wenn Du nur einen einzelnen Wert auslesen willst, ist das aber der falsche Code. In dem Fall solltest Du eher <SqlCommand>.ExecuteScalar() mit Auslesen des Rückgabewerts ausführen. Also bspw. so:

    public String GetResult( SqlConnection _connection, String _sqlStatement )
    {
        String result;
    
        SqlCommand command = new SqlCommand();
        command.Connection   = _connection;
        command.CommandText  = _sqlStatement;
        command.CommandType  = CommandType.Text;
    
        result = command.ExecuteScalar().ToString();
    
        command.Dispose();
    
        return result;
    }

    Aufruf dann bspw. so:

    String sql  = "Select Role from [Customers] Where FullName ='" + txtBN.Text + "' and Password='" + txtPW.Text + "'";
    String role = this.GetResult( conn, sql );

    Die Stringverkettung und Integration von Variablen in das SQL Statement ist aber so ziemlich die schlechteste Idee, die Du haben kannst. Verwende durchgehend Parameter Objekte, bei SQL Server SqlParameter um die Werte einzubinden.

    SqlConnection connection = new SqlConnection( "<ConnectionString>" );
    connection.Open();
    
    SqlCommand command  = new SqlCommand( "SELECT ... FROM ... WHERE Feld1 = @Wert1 AND Feld2 = @Wert2", connection );
    
    command.Parameters.AddWithValue( "@Wert1", TextBox1.Text );
    command.Parameters.AddWithValue( "@Wert2", TextBox2.Text );
    
    ...
    
    connection.Close();
    connection.Dispose();


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Freitag, 4. Mai 2018 08:46
    Moderator
  • Hallo, habe nun folgendes eingebau, funktioniert auch soweit nur spricht er weder auf Case noch auf if an.

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.Sql; using System.Data.SqlClient; namespace LagerverwaltungPIAWinForm { public partial class UCForm : Form { public string GetResult(SqlConnection _connection, String _sqlStatement) { string result; SqlCommand command = new SqlCommand(); command.Connection = _connection; command.CommandText = _sqlStatement; command.CommandType = CommandType.Text; result = command.ExecuteScalar().ToString(); command.Dispose(); return result; } public string Rolle; SqlConnection con = new SqlConnection(LagerverwaltungPIAWinForm.Properties.Settings.Default.LagerverwaltungPIAConnectionString);// Kein Gültiger Connectionstring SqlConnection conn = new SqlConnection("Data Source=192.168.10.6;Initial Catalog=LagerverwaltungPIA; User ID=RootProgramm; Password= root"); public UCForm() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { con.Open(); SqlDataAdapter sda = new SqlDataAdapter("Select Role from Customers where FullName='" + txtBN + "' and Password='" + txtPW + "' ", con); //SqlDataAdapter sda = new SqlDataAdapter("Select Role from customers", con); DataTable dt = new DataTable();//Fehler füllt anscheinend keine rows oder liegts am connectionsstring ? sda.Fill(dt);//? Count = 0 //SqlCommand da = new SqlCommand("Select Role from Customers where FullName ='" + txtBN + "' and Password='" + txtPW + "' ", con); string sql = "Select Role from [Customers] Where FullName ='" + txtBN.Text + "' and Password='" + txtPW.Text + "'"; string role = this.GetResult(con, sql); MessageBox.Show(role);//Steht "Role" drin // if (dt.Rows.Count == 1) // { switch (role)//Weder mit if noch mit case ruft er die gewollten daten auf

    //Fehler gefunden er hat ein paar leerzeichen im String { case "Admin": { MessageBox.Show("You are an Admin"); break; } case "Anleiter": MessageBox.Show("You are an Anleiter"); break; case "Lager": MessageBox.Show("You are an An2leiter"); break; case "Helfer": MessageBox.Show("You are an A3nleiter"); break; default: MessageBox.Show("Bitte einen Gültigen Benutzernamen / Password eingeben!"); break; } con.Close(); }



    Dienstag, 15. Mai 2018 09:51