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:
codice:
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')
GO
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'
il Codice C# per la gestione di questo file è questa
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;
}
Se eseguo le query senza utilizzare i blocchi TransactionScope tutto funziona.
Invece con il codice che ho postato funzionano tutte le query tranne le ultime 2:
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'
Infatti quando eseguo la prima scatta una sqlException con questa descrizione:
"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