DbParameter.Size is wrong with MS Sql nvarchar/nchar

Discussion of open issues, suggestions and bugs regarding Entity Developer - ORM modeling and code generation tool
Post Reply
mrmiagi0101
Posts: 10
Joined: Tue 27 Feb 2018 13:43

DbParameter.Size is wrong with MS Sql nvarchar/nchar

Post by mrmiagi0101 » Fri 10 Jul 2020 11:16

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!

Shalex
Site Admin
Posts: 8981
Joined: Thu 14 Aug 2008 12:44

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

Post by Shalex » Fri 17 Jul 2020 17:17

Thank you for your report. We have reproduced both issues and are investigating them. We will notify you about the result.

Shalex
Site Admin
Posts: 8981
Joined: Thu 14 Aug 2008 12:44

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

Post by Shalex » Fri 31 Jul 2020 18:15

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.

Post Reply