2011-09-28 11 views
6

Ho un problema, che non riesco a risolvere. Sto usando SQL Server 2005, C# CLR per usare la DLL esterna. è a lunghezza di parametro. Devo usare come parametro di funzione tipo varchar(max). Se al codice C# utilizzo string, SqlSring, non riesco a utilizzare il tipo T-SQL varchar(max), solo varchar(4000) di nvarchar(4000). Devo dire che può essere situazioni, quando ho bisogno di usare più di 4000 simboli, quindi ho bisogno di sapere quale tipo di C# devo usare per varchar(max).T-SQL (varchar (max) vs CLR (stringa, SqlString, SqlChars)?

Ho letto molti articoli, e molti di loro dicono, che per questo posso utilizzare SqlChars. Ma! Ho manipolazioni con stringhe. Come posso avere azioni con string o SqlString e quindi convertire in SqlChars? (È possibile SqlChars.ToString() o SqlChars.ToSqlString()).

Non ho trovato alcun codice C# per questo.

+0

A 'varchar (max)' stringa che sta usando la sua capacità massima non sarà caricabile in una stringa CLR, poiché esaurirà lo spazio degli indirizzi. Puoi essere più esplicito su quali azioni vuoi eseguire contro queste stringhe? –

+0

Converto qualsiasi tipo SQL in varchar e invio questo valore alla dll esterna. Quindi, manipolarlo e tornare a SQL Server. Ora uso SQL/vchar (4000) e C#/stringa. Ho bisogno di più di 4000 simboli. –

+0

@Damien_The_Unbeliever: Avevo l'impressione che sia 'varchar (max)' di SQL Server sia un'istanza di '' stringa' .NET potevano avere dimensioni fino a 2 GB .... –

risposta

0

Provare a utilizzare la lunghezza -1. Qualcosa del genere:

cmd.Parameters.Add("@param", SqlDbType.VarChar, -1).Value = "hdfiophdopigherog"; 
+0

Non riesco a provare questo, perché non ho SqlCommand ... Basta inserire parametro - manipolazione con parametro out - out. E ho bisogno che i parametri IN/OUT siano SqlChars –

+0

Mentre '-1' è tecnicamente corretto, questa risposta è ancora irrilevante alla domanda. Questa risposta riguarda una API SqlConnection e non l'API SQLCLR. –

4

Ho trovato la risposta. Non solo mi ha chiesto di questa domanda. Devo leggere i post più attentamente ...

Può leggere qui http://social.msdn.microsoft.com/Forums/is/sqlnetfx/thread/391ebb98-e1b5-47fc-a72d-9f1e39829e3a Il problema della compatibilità CLR non è molto difficile.

Tutte le volte che volevo usare varchar(max) e ho provato ad usare i tipi C# string, SqlString, SqlChars. È necessario utilizzare T-SQL nvarchar(max) ed è possibile utilizzare qualsiasi tipo di C# string, SqlString, SqlChars!

Ovviamente nvarchar occupando più spazio di varchar in due tempi.

+0

SQLCLR non consente 'VARCHAR', che sia 1 - 4000 o' MAX'. 'NVARCHAR' è l'unico tipo di stringa che passa l'API SQLCLR (beh, suppongo che' object'/'SQL_VARIANT' possa anche passare una stringa fino a 4000). Se passi nei valori di 'VARCHAR', vengono convertiti implicitamente in' NVARCHAR'. Per favore non usare, o suggerisci di usare, 'string' come input o output di tipo SQLCLR. Per maggiori informazioni, vedere la serie, [Scala a SQLCLR] (http: //www.sqlservercentral.it/stairway/105855 /), su SQL Server Central (è richiesta la registrazione gratuita per quel sito). –

11

Quello che dovete fare è aggiungere SqlFacet (MaxSize = -1) attribuiscono al parametro:

[return: SqlFacet(MaxSize = -1)] 
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)] 
public static SqlString YourSqlFunction([SqlFacet(MaxSize = -1)]SqlString sourceSS) 
{ return new } 
+0

corretto! Questo farà sì che VS crei automaticamente uno script corretto! –

+1

Questa risposta è corretta e deve essere contrassegnata come "accettata". +1 –

Problemi correlati