Page 1 of 1

DbParameter.Size is wrong with MS Sql nvarchar/nchar

Posted: Fri 10 Jul 2020 11:16
by mrmiagi0101
Hello,

there is a bug with creating of StoredPocedure parametes in EF Core.
I have this simple SP:
Create PROCEDURE [dbo].[Seek_ContainerBewegTest]
@Identnummer nvarchar(10),
@Identnummer2 varchar(10),
@Identnummer3 char(10),
@Identnummer4 nchar(10),
@identnummer5 ntext
AS
Select @Identnummer
GO

You can see everything has size 10, expect the last parameter.

1) If I create the methods with EntityDeveloper, the nvarchar(10) and nchar(10) prameter are created with size = 20! This is wrong. It should be the same as for varchar/char = 10:

Code: Select all

                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = @"dbo.Seek_ContainerBewegTest";

                    DbParameter IdentnummerParameter = cmd.CreateParameter();
                    IdentnummerParameter.ParameterName = "Identnummer";
                    IdentnummerParameter.Direction = ParameterDirection.Input;
                    IdentnummerParameter.DbType = DbType.String;
                    IdentnummerParameter.Size = 20;
                    if (Identnummer != null)
                    {
                        IdentnummerParameter.Value = Identnummer;
                    }
                    else
                    {
                        IdentnummerParameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(IdentnummerParameter);

                    DbParameter Identnummer2Parameter = cmd.CreateParameter();
                    Identnummer2Parameter.ParameterName = "Identnummer2";
                    Identnummer2Parameter.Direction = ParameterDirection.Input;
                    Identnummer2Parameter.DbType = DbType.String;
                    Identnummer2Parameter.Size = 10;
                    if (Identnummer2 != null)
                    {
                        Identnummer2Parameter.Value = Identnummer2;
                    }
                    else
                    {
                        Identnummer2Parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(Identnummer2Parameter);

                    DbParameter Identnummer3Parameter = cmd.CreateParameter();
                    Identnummer3Parameter.ParameterName = "Identnummer3";
                    Identnummer3Parameter.Direction = ParameterDirection.Input;
                    Identnummer3Parameter.DbType = DbType.String;
                    Identnummer3Parameter.Size = 10;
                    if (Identnummer3 != null)
                    {
                        Identnummer3Parameter.Value = Identnummer3;
                    }
                    else
                    {
                        Identnummer3Parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(Identnummer3Parameter);

                    DbParameter Identnummer4Parameter = cmd.CreateParameter();
                    Identnummer4Parameter.ParameterName = "Identnummer4";
                    Identnummer4Parameter.Direction = ParameterDirection.Input;
                    Identnummer4Parameter.DbType = DbType.String;
                    Identnummer4Parameter.Size = 20;
                    if (Identnummer4 != null)
                    {
                        Identnummer4Parameter.Value = Identnummer4;
                    }
                    else
                    {
                        Identnummer4Parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(Identnummer4Parameter);

                    DbParameter identnummer5Parameter = cmd.CreateParameter();
                    identnummer5Parameter.ParameterName = "identnummer5";
                    identnummer5Parameter.Direction = ParameterDirection.Input;
                    identnummer5Parameter.DbType = DbType.String;
                    identnummer5Parameter.Size = 2147483647;
                    if (identnummer5 != null)
                    {
                        identnummer5Parameter.Value = identnummer5;
                    }
                    else
                    {
                        identnummer5Parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(identnummer5Parameter);
2) The method Designer has also a bug: The ntext param Size is not refreshed in Desginer. It is always the size of the last selected param. If you open the settings of the method and switch to parameter tab. The first parameter (Identnummer) is selected showing the wrong size 20. If you now switch to the last (ntext) parameter, it also shows 20! If you now switch to the second param, it shows the 10. If you now switch back to the last parameter (ntext) it shows also 10!

Re: DbParameter.Size is wrong with MS Sql nvarchar/nchar

Posted: Fri 17 Jul 2020 17:17
by Shalex
Thank you for your report. We have reproduced both issues and are investigating them. We will notify you about the result.

Re: DbParameter.Size is wrong with MS Sql nvarchar/nchar

Posted: Fri 31 Jul 2020 18:15
by Shalex
The bug with detecting DbParameter.Size for the NVARCHAR/NCHAR columns of SQL Server in EF Core Model is fixed: viewtopic.php?f=32&t=41442.