Fehler beim Verbinden mit SQLExpress



  • Wollte die Beispielanwendung aus "Visual C# 2005" von Kevin Hoffmann testen (Listing 17.1, in der deutschen Übersetzung v. Markt und Technik auf Seite 255). Es tritt ein Fehler auf, rufe ich den Debugger auf bekomme ich folgende Fehlermeldung:

    Die von der Anmeldung angeforderte "TestDB"-Datenbank kann nicht geöffnet werden. Fehler bei der Anmeldung.
    Fehler bei der Anmeldung für den Benutzer 'RECHNERNAME\benutzer'.

    Es scheint prinzipiell alles zu stimmen, der SQL Express Server läuft. Für den Benutzer ist ein Passwort vergeben und er ist Computeradministrator. Wenn ich dann in der Dialogbox die allgemeine Hilfe dazu aufrufe, steht da folgendes:
    ---
    Eine SqlException-Ausnahme wird generiert, wenn von SQL Server eine Warnung oder ein Fehler zurückgegeben wird.

    Tipps
    Stellen Sie sicher, dass Sie gültige Anmeldeinformationen verwenden.
    Stellen Sie sicher, dass die von Ihnen angegebenen Anmeldeinformationen gültig sind. Weitere Informationen finden Sie unter Gewusst wie: Zugriff auf SQL Server mit vordefinierten Anmeldeinformationen.

    Überprüfen Sie den Servernamen, und stellen Sie sicher, dass der Server ausgeführt wird.
    Stellen Sie sicher, dass Sie den korrekten Servernamen verwenden und dass der Server erreichbar ist. Weitere Informationen finden Sie unter Gewusst wie: Herstellen von Verbindungen mit SQL Server-Datenbanken.
    ---

    Mein Problem ist wohl, dass ich mich mit dem SQL Server überhaupt nicht auskenne (mit SQL-Datenbanken, PostgreSQL, schon)

    using System;
    using System.Data;
    using System.Data.Common;
    using System.Data.SqlClient;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConnectionTest {
    class Program {
        static void Main(string[] args) {
            SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder();
            connBuilder.InitialCatalog="TestDB";
            connBuilder.DataSource=@".\SQLExpress";
            connBuilder.IntegratedSecurity=true;
    
            conn.Open();
            Console.WriteLine("Connected to SQL Server v"+conn.ServerVersion);
            conn.Close();
            Console.ReadLine();
        }
    } // class Program
    } // namespace ConnectionTest
    


  • Hi,

    kannst du dich denn mit dem SQL Management Studio denn auf dem SQL Server einloggen oder woher weißt du, dass der Server ordnungsgemäß läuft und dein Nutzer die nötigen Berechtigungen hat?

    mfG
    KaPtainCugel



  • Problem (gerade eben) gelöst 🙂 Das war ein Fehler in dem Buch. Es gibt im SQL Server Express überhaupt keine Datenbank namens "TestDB". Einfach die Zeile "connBuilder.InitialCatalog="TestDB";" auskommentieren und es läuft. Oder (so kam ich darauf):

    "Microsoft SQL Server Management Studio Express" (in der richtigen Version, bei mir also 2005 ServicePack 4 (findet man mit Google schnell auf den MS-Seiten) installieren und darin eine Datenbank namens "TestDB" anlegen.

    Etwas befremdlich das MS in meiner VS Studio Professional den MS SQL SMSE nicht von Haus auf dabei hat. Das ist IMHO eines der wichtigsten Werkzeuge für den SQL Server. Und gerade beim Entwickeln muss man ja Datenbanken überprüfen können. Das nervt so bei MS, das irgendwelche wichtigen Tools immer fehlen. Das zieht sich leider durch fast all deren Produkte. Hätte ich dieses Tool eher gehabt, hätte ich den Fehler vermutlich sofort gefunden und diesen Thread gäbe es gar nicht.



  • Da die Datenbank TestDB in dem Buch öfter benötigt wird, habe ich jetzt eine entsprechende Datenbank erstellt. Die Beispiele bis 17.4 habe ich damit getestet und sie funktionieren. Beispiel 17.2 so wie im Buch nur einmal, da dann der UserName schon vorhanden ist und UserName von mir UNIQUE deklariert wurde. Siehe verbessertes Beispiel unten. Einfach die SQL-Datei mit dem SQL Server Managementstudio öffnen, Rechtsklick in das Fenster und "Ausführen" wählen, dann wird die Datenbank erstellt.

    use master
    GO
    Create Database TestDB
    GO
    -- Verify the database files and sizes
    SELECT name, size, size*1.0/128 AS [Size in MBs] 
    FROM sys.master_files
    WHERE name = N'TestDB';
    GO
    use TestDB
    
    /****** Objekt:  Table [dbo].[Users]    Skriptdatum: 02/28/2013 14:23:06 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Users](
    	[FirstName] [nvarchar](50) NULL,
    	[LastName] [nvarchar](50) NULL,
    	[UserName] [nvarchar](50) NOT NULL,
    	[UserID] [int] IDENTITY(1,1) NOT NULL,
     CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
    (
    	[UserID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
     CONSTRAINT [UQ_Users] UNIQUE NONCLUSTERED 
    (
    	[UserName] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    insert into Users values ('Kevin','Hoffman','kh')
    insert into Users values ('Bjarne','Stroustrup','bs')
    insert into Users values ('Dennis','Ritchie','dr')
    insert into Users values ('Brian','Kernighan','bk')
    insert into Users values ('Guido','van Rossum','gvr')
    GO
    /****** Objekt:  StoredProcedure [dbo].[sp_Create_User]    Skriptdatum: 02/28/2013 14:23:03 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- =============================================
    -- Author:		hps
    -- Create date: 2013-02-27
    -- Description:	sp_Create_User
    -- Stored procedure for example 17.2 from "Visual C# 2005", Kevin Hoffman, Markt+Technik, p. 257
    -- =============================================
    CREATE PROCEDURE [dbo].[sp_Create_User] 
    	-- Add the parameters for the stored procedure here
    	@UserName	nvarchar(50),
    	@FirstName	nvarchar(50)=null,
    	@LastName	nvarchar(50)=null
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Insert statements for procedure here
    	if @UserName = Null or @UserName = '' begin
    		raiserror('You must specify a user name (Column "UserName")',
    			18,-1, 'sys.sp_createstats')
    		return @@error
    	end
    	insert into Users(UserName,FirstName,LastName)  values(@UserName,@FirstName,@LastName)
    	return (0)
    END
    GO
    /****** Objekt:  StoredProcedure [dbo].[sp_Query_UserCount]    Skriptdatum: 02/28/2013 14:23:03 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- =============================================
    -- Author:		hps
    -- Create date: 2013.02-28
    -- Description: sp_Query_UserCount - stored SQL Server procedure for
    -- Listing 17.4, p. 258, Visual C#, Kevin Hoffman, Markt+Technik Verlag
    -- =============================================
    CREATE PROCEDURE [dbo].[sp_Query_UserCount] 
    	@UserCount int output
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Insert statements for procedure here
        select * from Users
    	set @UserCount = @@RowCount
    	return(0)
    END
    GO
    

    Verbessertes Listing 17.2 mit Fehlerausgabe (z. b. weil UserName schon existiert):

    using System;
    using System.Data;
    using System.Data.Common;
    using System.Data.SqlClient;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Command2 {
        class Program {
            static void Main(string[] args) {
                SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder();
                connBuilder.InitialCatalog = "TestDB";
                connBuilder.DataSource = @".\SQLExpress";
                connBuilder.IntegratedSecurity = true;
                SqlConnection conn = new SqlConnection(connBuilder.ConnectionString);
                conn.Open();
    
                SqlCommand cmd=conn.CreateCommand();
                cmd.CommandText="sp_Create_User";
                cmd.CommandType=CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@UserName","Jane"));
                cmd.Parameters.Add(new SqlParameter("@FirstName", "Jane"));
                cmd.Parameters.Add(new SqlParameter("@LastName", "Doe"));
                try {
                    cmd.ExecuteNonQuery();
                } catch (/*System.Data.SqlClient.*/SqlException e) {
                    Console.WriteLine("SQL Exception {0}",e.Message);
                }
            }
        }
    }
    


  • Beispiel 17.7 (fehlt wie alle Beispiele aus Kapitel 17 bei den Beispielen von M+T) funktioniert auch. Es verändert die Tabelle (löscht Bjarne Stroustrup und legt einen "Brand New" Datensatz neu an). Die Original-Tabelle kann man einfach wieder herstellen indem man im SMSE die TestDB-Datenbank löscht und mit dem SQL-Script aus dem vorherigen Beitrag wieder neu erstellt.

    using System;
    using System.Data;
    using System.Data.Common;
    using System.Data.SqlClient;
    using System.Collections.Generic;
    using System.Text;
    
    namespace DataAdapter {
        class Program {
            static void Main(string[] args) {
                SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder();
                connBuilder.InitialCatalog = "TestDB";
                connBuilder.DataSource = @".\SQLExpress";
                connBuilder.IntegratedSecurity = true;
                SqlConnection conn = new SqlConnection(connBuilder.ConnectionString);
                conn.Open();
    
                SqlCommand selectCommand=conn.CreateCommand();
                selectCommand.CommandText="Select * from Users";
    
                SqlCommand updateCommand=conn.CreateCommand();
                updateCommand.CommandText=
                    "update Users set UserName=@UserName,FirstName=@FirstName "+
                    ",LastName=@LastName where UserID=@UserID";
                updateCommand.Parameters.Add(
                    new SqlParameter("@UserName",SqlDbType.VarChar, 50, "UserName"));
                updateCommand.Parameters.Add(
                    new SqlParameter("@FirstName", SqlDbType.VarChar, 50, "FirstName"));
                updateCommand.Parameters.Add(
                    new SqlParameter("@LastName", SqlDbType.VarChar, 50, "LastName"));
                updateCommand.Parameters.Add(
                    new SqlParameter("@UserID", SqlDbType.Int, 4, "UserID"));
    
                SqlCommand deleteCommand=conn.CreateCommand();
                deleteCommand.CommandText="delete Users Where UserID=@UserID";
                deleteCommand.Parameters.Add(new SqlParameter("UserID",SqlDbType.Int,4,"UserID"));
    
                SqlCommand insertCommand = conn.CreateCommand();
                insertCommand.CommandText = "insert into Users(UserName,FirstName,LastName) "+
                    "values(@UserName,@FirstName,@LastName)";
                insertCommand.Parameters.Add(
                    new SqlParameter("@UserName", SqlDbType.VarChar, 50, "UserName"));
                insertCommand.Parameters.Add(
                    new SqlParameter("@FirstName", SqlDbType.VarChar, 50, "FirstName"));
                insertCommand.Parameters.Add(
                    new SqlParameter("@LastName", SqlDbType.VarChar, 50, "LastName"));
                insertCommand.Parameters.Add(
                    new SqlParameter("@UserID", SqlDbType.Int, 4, "UserID"));
    
                DataSet ds=new DataSet();
                SqlDataAdapter sqlDa=new SqlDataAdapter(selectCommand);
                sqlDa.UpdateCommand=updateCommand;
                sqlDa.DeleteCommand=deleteCommand;
                sqlDa.InsertCommand=insertCommand;
                sqlDa.Fill(ds);
    
                // Aktualisiert eine bestehende Zeile:
                DataTable users=ds.Tables[0];
                users.Rows[1].Delete();
    
                // Erstellt eine neue Zeile:
                DataRow newUser=users.NewRow();
                newUser["UserName"]="added";
                newUser["FirstName"]="Brand";
                newUser["LastName"]="New";
                users.Rows.Add(newUser);
    
                // Ruft Update auf, um den Update-, den Delete- und den Insert-Befehl
                // über den DataAdapter an der zugehörigen Datenquelle aufzurufen99:
                sqlDa.Update(ds);
                Console.WriteLine("Update complete\n");
                Console.ReadLine();
            }
        }
    }
    

Anmelden zum Antworten