Wie wir herausgefunden haben, haben Sie den falschen Typ für einen UniqueIdentifier verwendet. Sie sollten verwenden DbType.Guid
statt einer Zeichenkette, aber Sie haben in den Kommentaren andere Fragen aufgeworfen, die ich nicht in einem Kommentar beantworten konnte und bei denen ich mir nicht sicher war, so dass ich sie testen musste.
Sie sind
- Welche Größe sollten Sie für die verschiedenen String-Ausgabeparameter festlegen?
- Spielt es eine Rolle, ob es ein Nvarchar oder varchar ist?
- Was passiert, wenn man sie zu groß oder zu klein macht?
Ich begann mit der Verwendung von SqlCommandBuilder.DeriveParameters
um herauszufinden, was ADO.NET und SQL Server denken, dass es sein sollte, und führte dann die Stored Procedure aus, um zu sehen, was unsere Rückgabewerte waren.
Sql Type | DbType | Size | Returned string.Length()
----------------------------------------------------------------
Varchar(10) | AnsiString | 10 | 9
Char(10) | AnsiStringFixedLength | 10 | 10
Nvarchar(10 | String | 10 | 9
Varchar(max) | AnsiString | -1 | 20,480
NVarchar(max)| String | -1 | 20,480
Wie erwartet stimmten die abgeleiteten Größen mit dem Längenfeld für alle Zeichentypen überein, mit Ausnahme von max und den Rückgabewerten, die die erwartete Länge hatten. Bei der Betrachtung der max-Typen und DbTypes ergaben sich jedoch einige neue Fragen zu den ersten drei.
-
Was hat es mit dem Typ AnsiString auf sich, und wenn wir ihn stattdessen auf DbType.String setzen, hat das Auswirkungen auf die Ausgabe, wenn wir die gleiche Größe beibehalten? Antwort: Nein, wahrscheinlich weil .NET-Strings Unicode sind.
-
Ist die Erhöhung der Paramater.Size
einen der Nicht-Max-Werte beeinflussen? Antwort: Ja, aber nur char(10). Es erhöht die Ausgabegröße durch Hinzufügen von Leerzeichen.
-
Ist die Verringerung des Paramater.Size
einen der Nicht-Max-Werte beeinflussen? Ja, die Rückgabewerte werden abgeschnitten.
-
Ist eine Größe von -1 magisch? Antwort: Ja, wenn Sie die Größe auf -1 setzen, werden die Werte so zurückgegeben, als ob Sie sie korrekt eingestellt hätten.
Testcode .NET 4.0 SQL Server 2008
SQL-Code
CREATE PROCEDURE SomeOutput(
@tenVC varchar(10) output,
@tenC char(10) output,
@tenNVC nvarchar(10) output,
@maxVC varchar(max) output,
@maxNVC nvarchar(max) output,
@Indentifier uniqueidentifier output)
AS
SELECT @tenC = '123456789',
@tenVC = '123456789',
@tenNVC = '123456789',
@Indentifier = NEWID(),
@maxVC = '',
@maxNVC = ''
SELECT
@maxVC = @maxVC + '1234567890',
@maxNVC = @maxNVC + '1234567890'
FROM
master..spt_values
WHERE
type= 'P'
C#-Code
static void Main(string[] args)
{
using (SqlConnection cnn = new SqlConnection("Server=.;Database=Test;Trusted_Connection=True;"))
{
SqlCommand cmd = new SqlCommand("SomeOutput", cnn);
cmd.CommandType = CommandType.StoredProcedure;
cnn.Open();
SqlCommandBuilder.DeriveParameters(cmd);
Printparams(cmd.Parameters, "Derived");
foreach (SqlParameter param in cmd.Parameters)
{
//By default output parameters are InputOutput
//This will cause problems if the value is both null
if (param.Direction == ParameterDirection.InputOutput )
param.Direction = ParameterDirection.Output;
}
cmd.ExecuteNonQuery();
Printparams(cmd.Parameters ,"Executed");
cmd.Parameters["@tenVC"].DbType = DbType.String;
cmd.Parameters["@tenNVC"].DbType = DbType.AnsiString;
cmd.ExecuteNonQuery();
Printparams(cmd.Parameters, "DbType change");
foreach (SqlParameter param in cmd.Parameters)
{
if (param.DbType != DbType.Int32
&& param.DbType != DbType.Guid
&& param.Size != -1)
{
param.Size = param.Size * 2;
}
}
cmd.ExecuteNonQuery();
Printparams(cmd.Parameters, "Mangeled sizes up");
foreach (SqlParameter param in cmd.Parameters)
{
if (param.DbType != DbType.Int32
&& param.DbType != DbType.Guid
&& param.Size != -1)
{
param.Size = param.Size / 4;
}
}
cmd.ExecuteNonQuery();
Printparams(cmd.Parameters, "Mangeled sizes down");
cmd.Parameters["@maxVC"].Size = Int32.MaxValue;
cmd.Parameters["@maxNVC"].Size = Int32.MaxValue;
cmd.ExecuteNonQuery();
Printparams(cmd.Parameters, "Fixed max sizes");
foreach (SqlParameter param in cmd.Parameters)
{
if (param.DbType != DbType.Int32
&& param.DbType != DbType.Guid)
{
param.Size = -1;
}
}
cmd.ExecuteNonQuery();
Printparams(cmd.Parameters, "is negative one magic");
}
}
Ausgänge
Derived
@RETURN_VALUE : Int32 : 0 : ReturnValue : 0 :
@tenVC : AnsiString : 10 : InputOutput : 0 :
@tenC : AnsiStringFixedLength : 10 : InputOutput : 0 :
@tenNVC : String : 10 : InputOutput : 0 :
@maxVC : AnsiString : -1 : InputOutput : 0 :
@maxNVC : String : -1 : InputOutput : 0 :
@Indentifier : Guid : 0 : InputOutput : 0 :
Executed
@RETURN_VALUE : Int32 : 0 : ReturnValue : 1 : 0
@tenVC : AnsiString : 10 : Output : 9 : 123456789
@tenC : AnsiStringFixedLength : 10 : Output : 10 : 123456789
@tenNVC : String : 10 : Output : 9 : 123456789
@maxVC : AnsiString : -1 : Output : 20480 : 123456789012345678901234567
@maxNVC : String : -1 : Output : 20480 : 123456789012345678901234567
@Indentifier : Guid : 0 : Output : 36 : eccc3632-4d38-44e8-9edf-031
DbType change
@RETURN_VALUE : Int32 : 0 : ReturnValue : 1 : 0
@tenVC : String : 10 : Output : 9 : 123456789
@tenC : AnsiStringFixedLength : 10 : Output : 10 : 123456789
@tenNVC : AnsiString : 10 : Output : 9 : 123456789
@maxVC : AnsiString : -1 : Output : 20480 : 123456789012345678901234567
@maxNVC : String : -1 : Output : 20480 : 123456789012345678901234567
@Indentifier : Guid : 0 : Output : 36 : 94cb0039-8587-4357-88fb-25c
Mangeled sizes up
@RETURN_VALUE : Int32 : 0 : ReturnValue : 1 : 0
@tenVC : String : 20 : Output : 9 : 123456789
@tenC : AnsiStringFixedLength : 20 : Output : 20 : 123456789
@tenNVC : AnsiString : 20 : Output : 9 : 123456789
@maxVC : AnsiString : -1 : Output : 20480 : 123456789012345678901234567
@maxNVC : String : -1 : Output : 20480 : 123456789012345678901234567
@Indentifier : Guid : 0 : Output : 36 : 4de88f14-9963-4a78-b09b-bb6
Mangeled sizes down
@RETURN_VALUE : Int32 : 0 : ReturnValue : 1 : 0
@tenVC : String : 5 : Output : 5 : 12345
@tenC : AnsiStringFixedLength : 5 : Output : 5 : 12345
@tenNVC : AnsiString : 5 : Output : 5 : 12345
@maxVC : AnsiString : -1 : Output : 20480 : 123456789012345678901234567
@maxNVC : String : -1 : Output : 20480 : 123456789012345678901234567
@Indentifier : Guid : 0 : Output : 36 : 5e973e72-14e5-4b75-9cff-e88
Fixed max sizes
@RETURN_VALUE : Int32 : 0 : ReturnValue : 1 : 0
@tenVC : String : 5 : Output : 5 : 12345
@tenC : AnsiStringFixedLength : 5 : Output : 5 : 12345
@tenNVC : AnsiString : 5 : Output : 5 : 12345
@maxVC : AnsiString : 2147483647 : Output : 20480 : 123456789012345678901234567
@maxNVC : String : 2147483647 : Output : 20480 : 123456789012345678901234567
@Indentifier : Guid : 0 : Output : 36 : 6cab2b41-d4ba-42d2-a93a-e59
is negative one magic
@RETURN_VALUE : Int32 : 0 : ReturnValue : 1 : 0
@tenVC : String : -1 : Output : 9 : 123456789
@tenC : AnsiString : -1 : Output : 10 : 123456789
@tenNVC : AnsiString : -1 : Output : 9 : 123456789
@maxVC : AnsiString : -1 : Output : 20480 : 123456789012345678901234567
@maxNVC : String : -1 : Output : 20480 : 123456789012345678901234567
@Indentifier : Guid : 0 : Output : 36 : 0d69ed57-fab7-49c8-b03a-d75