Ciao,
ho un problema nell'esecuzione di uno script .sql da un'applicazione c#.
Io ho questo file kkk.sql che ho generato da Management Studio e che ho modificato.
Questo script ovviamente lanciato da Management Studio funziona correttamente e funziona anche se lo lancio da c# senza utilizzare le transazioni.
Ora vi faccio un esempio
Il file sql è questo:
il Codice C# per la gestione di questo file è questacodice:USE [MIODB] GO /****** Object: Table [dbo].[Categories] Script Date: 10/24/2007 11:43:58 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[KKK_Categories]( [KKK_CATEGORY_ID] [smallint] NOT NULL, [Description] [nvarchar](50) COLLATE Latin1_General_CI_AS NULL, CONSTRAINT [PK_KKK_Categories] PRIMARY KEY CLUSTERED ( [KKK_CATEGORY_ID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO insert into dbo.KKK_Categories (KKK_CATEGORY_ID,Description) VALUES (1,'CIAO') GOcodice:EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID reparto' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'KKK_Categories', @level2type=N'COLUMN', @level2name=N'KKK_CATEGORY_ID' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Descrizione reparto' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'KKK_Categories', @level2type=N'COLUMN', @level2name=N'Description'
Se eseguo le query senza utilizzare i blocchi TransactionScope tutto funziona.codice:try { String wholeSql = String.Empty; String fname = @"C:\SQLScript\kkk.sql"; if (File.Exists(fname)) { using (StreamReader sr = new StreamReader(fname)) { wholeSql = sr.ReadToEnd(); } } //Eseguo lo split su ogni riga che inizia con GO Regex regEx = new Regex("^GO", RegexOptions.Multiline); String[] sqlStatements = regEx.Split(wholeSql); List<String> ret = new List<String>(); foreach (String s in sqlStatements) { if (!(s.StartsWith("USE", StringComparison.OrdinalIgnoreCase) && s.Trim().Length > 0)) { ret.Add(s.Trim()); } } using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,new TimeSpan(0,5,0))) using (SqlConnection conn = new SqlConnection("Data Source=SOURCE;Initial Catalog=MIODB;Persist Security Info=True;User ID=sa;Password=pwd")) { SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; //loop through each block in the spilt SQL and execute. foreach (String sql in ret) { if (sql.Trim().Length > 0) { using (TransactionScope ts1 = new TransactionScope( TransactionScopeOption.Required, new TimeSpan(0, 5, 0))) { cmd.CommandText = sql; conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); ts1.Complete(); } } } ts.Complete(); } } catch (Exception ex) { throw ex; }
Invece con il codice che ho postato funzionano tutte le query tranne le ultime 2:
Infatti quando eseguo la prima scatta una sqlException con questa descrizione:codice:EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID reparto' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'KKK_Categories', @level2type=N'COLUMN', @level2name=N'KKK_CATEGORY_ID' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Descrizione reparto' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'KKK_Categories', @level2type=N'COLUMN', @level2name=N'Description'
"Cannot use SAVE TRANSACTION within a distributed transaction"
Cosa vuole dire?
PErchè le altre query me le esegue e queste due stored procedure no?
Grazie
Michele


Rispondi quotando