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(); } } }