Właściwość ConnectionString nie została zainicjowana

0

Mam bazę lokalną MsSql oraz łączę się czasem z bazą Mssql w internecieza pomocą procedury:

            string commandText = "SELECT Id FROM dbo.Tabela WHERE Nazwa=@Nazwa";
            conn="Data Source=mssql.www.pl,55432;Initial Catalog=mojkatalog;User ID=uzytkownik;Password=haslo";
            using (SqlConnection connection = new SqlConnection(conn))
            {
                SqlCommand command = new SqlCommand(commandText, connection);
                command.Parameters.Add("@Nazwa", SqlDbType.NVarChar);
                command.Parameters["@NazDlu"].Value = "Nazwa Firmy";
                try
                {
                    connection.Open();      // TU WYWALA BŁĄD
                    i = Convert.ToInt32(command.ExecuteScalar());
                    connection.Close();     
                }
                catch (Exception ex)
                {
                    Message.Show(ex.ToString());
                }
            }

Czasem pojawia się błąd:

System.InvalidOperationException: Właściwość ConnectionString nie została zainicjowana.
   w System.Data.SqlClient.SqlConnection.PermissionDemand()
   w System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
   w System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   w System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   w System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   w System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   w System.Data.SqlClient.SqlConnection.Open()
   w Aplikacja.fmBazaWww.btnSprWww_Click(Object sender, EventArgs e) w c:\fmBazaWww.cs:wiersz 166

Potrafię stworzyć powtarzalną sytuację, w której błąd występuje:
1 usuwam bazę lokalną skryptem sql, a następnie zakładam skryptem sql bazę lokalną,
2 Uruchamiam program i po wybraniu opcji łączącej się z bazą www wyskakuje błąd.
3 Przy kolejnych uruchomieniach programu (w tym po resecie kompa) i tej opcji nie ma błędu !!!
Jakiż związek jest bazy lokalnej z bazą www ???
Sprawa poważna, bo jak klientowi dać taki program...
Proszę o pomoc.

1

Jedyne, co mi przychodzi do głowy, to może jakaś sesja. Jeśli tworzysz bazę skryptem, to może coś nie jest zamykane, coś nie jest zatwierdzane. Spróbuj na koniec dać COMMIT. A może nie masz GO w skrypcie?

1

Gdzie masz deklarację tego conn? Pokaż więcej kodu, całą klasę w której znajduje się kod który wkleiłeś.

0

Skrypt tworzenia bazy pochodzi z SSMS (ma 30 tablic i kilkaset Insertów):

USE [master]
GO
/****** Object:  Database [baza]    Script Date: 2016-10-01 10:34:52 ******/
CREATE DATABASE [baza]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'baza', FILENAME = N'C:\baza.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'baza_log', FILENAME = N'C:\baza_log.ldf' , SIZE = 2816KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [baza] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [baza].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [baza] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [baza] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [baza] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [baza] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [baza] SET ARITHABORT OFF 
GO
ALTER DATABASE [baza] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [baza] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [baza] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [baza] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [baza] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [baza] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [baza] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [baza] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [baza] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [baza] SET  DISABLE_BROKER 
GO
ALTER DATABASE [baza] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [baza] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [baza] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [baza] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [baza] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [baza] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [baza] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [baza] SET RECOVERY SIMPLE 
GO
ALTER DATABASE [baza] SET  MULTI_USER 
GO
ALTER DATABASE [baza] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [baza] SET DB_CHAINING OFF 
GO
ALTER DATABASE [baza] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO
ALTER DATABASE [baza] SET TARGET_RECOVERY_TIME = 0 SECONDS 
GO
ALTER DATABASE [baza] SET DELAYED_DURABILITY = DISABLED 
GO
USE [baza]
GO
/****** Object:  Schema [dbo]    Script Date: 2016-10-01 10:34:52 ******/
CREATE SCHEMA [dbo]
GO
/****** Object:  Table [dbo].[Firmy]    Script Date: 2016-10-01 10:34:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Firmy](
	[Id] [smallint] NOT NULL,
	[Nazwa] [varchar](40) NOT NULL,
 CONSTRAINT [PK_Firmy] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO

INSERT [dbo].[Firmy] ([Id], [Nazwa]) VALUES (1, N'Nazwa')
INSERT [dbo].[Firmy] ([Id], [Nazwa]) VALUES (2, N'Nazwa')
GO
USE [master]
GO
ALTER DATABASE [baza] SET  READ_WRITE 
GO

a wywołuje go:

sqlcmd.exe -S Komputer\Instancja -U sa -P password -i SKRYPT.sql -o log.log

Jest GO.

Podsumowując: usuwam i tworzę bazę lokalną, restartuję komputer, uruchamiam program i próbując połączyć się z bazą www wywala ww błąd. Wychodzę z programu.
Jak teraz ponownie uruchomię program to łączę się z bazą www (po restarcie kompa również).
Co się mogło zmienić i gdzie się coś zapisało, że program działa?
Na innym PC to samo (czyli baza www jest ok).
AAAA ... tak naprawdę connectionstring sczytywany był z pliku... jak wstawiłem jego wartość bezpośrednio do procedury to wszystko OK.
Na razie nie wiem czemu odczyt z pliku przeszkadza, ale już bliżej rozwiązania.

Dzięki za pomoc. To bardzo wspiera.

DAMIAN MIAŁ RACJĘ:
Po utworzeniu bazy i uruchomieniu programu sprawdzał parametr "czyKorzystacZWww" i jeśli tak to sczytywał connectionstring z pliku.
Ponieważ parametr domyślnie po utworzeniu bazy był na false to connectionstring był pusty chociaż parametr zmieniłem na true.
Dopiero 2-gie uruchomienie odczytywało connectionstring.

Jeszcze raz dziękuję za pomoc.

1

A może problem polega na tym, ze bazę zakładasz bezpośrednio na dysku c?
I czy pisząc baza lokalna, masz na myśli localDB czy po prostu na lokalnej instancji SQL Servera?

2

Strasznie mieszasz, nie za bardzo wiem o co chodzi:

  1. Piszesz, że usuwasz i dodajesz bazę skryptem, w skrycie który podajesz nie ma usuwania bazy.
  2. Piszesz, że puszczasz skrypt lokalnie restartujesz kompa, poczym łączysz się z bazą www. Czy baza www to ta ktorą utworzyłes lokalnie, czy jak sugeruje nazwa gdzieś w sieci Internet?
  3. Nie podajesz przykładu jak inicjalizujesz zmienna conn, bo komunikat wskazuje jasno że problem jest z connectionStringiem i przypisanie powinno być poprzedzone @:
conn = @"Twój connection string"
  1. Skrypt który podajesz do tworzenia bazy jest niepełny, bo niezgodny z opisem.
  2. To zrób taki test, bo mam wrażenie, ze szukasz problemu tam gdzie go nie ma, odtwórz problem w aplikacji i jak go dostaniesz, to odpal SSMS i połącz się z bazą i zobacz czy problem jest po stronie bazy.
  3. NIE ZAKŁADAJ bazy na dysku c:
0

Po usunięciu bazy (skrypt sql) i utworzeniu i wypełnieniu bazy (skrypt sql) i uruchomieniu programu, program podczas Load sprawdzał parametr "czyKorzystacZWww" i jeśli tak to sczytywał connectionstring z pliku.
Po utworzeniu bazy parametr domyślnie był na false więc początkowo connectionstring był pusty.

            if (czyKorzystacZWww)
            {
               conn= "Data Source=costam itd...";
            }

Zmieniam parametr w nowej formatce na true. Sprawdzam połączenie i nie działa ... no bo conn="".
Dopiero 2-gie uruchomienie odczytywało connectionstring.
No to namieszałem niepotrzebnie (braki w debugowaniu), sorki... ale dzięki Waszemu wsparciu po problemie.
PS
Dlaczego nie zakładać bazy na dysku c?

0
mimirus napisał(a):

Dlaczego nie zakładać bazy na dysku c?

Sam piszesz w pierwszym poście, ze program idzie do klienta, to teraz sobie wyobraź sytuacje, że masz klienta który postawił sobie SQL i konto na którym chodzi usługa SQL Servera nie ma dostępu do zapisu i odczytu na dysku c. Ile nerwów straci klient, bo utknie na konfiguracji, a ile nerwów i czasu zajmie ci zdiagnozowanie co jest nie tak?

Podczas instalacji SQL servera podaje się domyslny katalog baz danych i instalator nadaje potrzebne uprawnienia do tego katalogu...

Dlatego, jeżeli nie znasz lokalizacji danych to jej nie podowaj
i zamiast:

CREATE DATABASE [baza]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'baza', FILENAME = N'C:\baza.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'baza_log', FILENAME = N'C:\baza_log.ldf' , SIZE = 2816KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

zrób coś w ten desń:

CREATE DATABASE [baza]
GO
ALTER DATABASE [baza] MODIFY FILE
( NAME = N'baza' ,  SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
GO
ALTER DATABASE [baza] MODIFY FILE
( NAME = N'baza_log' ,  SIZE = 2816KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

1 użytkowników online, w tym zalogowanych: 0, gości: 1