Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    TransactionScope

    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
    Baciamo le mani... ThE GoDfAtHeR

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Il linguaggio va indicato anche nel titolo, come da Regolamento.

    Qui l'ho aggiunto io, correggendo anche la descrizione del problema per renderla più esplicativa.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.