【问题标题】:Getting only first character in Output parameter in C#在 C# 的输出参数中仅获取第一个字符
【发布时间】:2014-04-16 22:48:35
【问题描述】:

我已经定义了输出参数,如下所示:

C#:

scom.Parameters.Add("@User_ID",SqlDbType.VarChar,8).Direction = ParameterDirection.Output ;

Sql:

@User_ID varchar(8) output

我在 Sql Server 中执行过程时得到完整的字符串,但在 C# 中只得到第一个字符。我进行了很多搜索,并确保在 C# 和 Sql 中都定义了大小。即使我尝试使用固定长度字符(Char(8)),但仍然只获得 C# 中的第一个字符。请让我知道是什么问题。

C# 代码:

public bool CheckPhone(string phoneNumber)
{
    SqlConnection myconn=new SqlConnection(connectionString);
    try
    {
        myconn.Open();
        SqlCommand scom = new SqlCommand("AuthenticatePhone", myconn);
        scom.CommandType = CommandType.StoredProcedure;
        scom.Parameters.Add("@phoneNumber", SqlDbType.BigInt).Value = Convert.ToInt64(phoneNumber);
        scom.Parameters.Add("@User_ID", SqlDbType.Char, 8).Direction = ParameterDirection.Output;

        scom.Parameters.Add("@User_Name", SqlDbType.Char, 120).Direction = ParameterDirection.Output;

        scom.ExecuteNonQuery();
        if (scom.Parameters["@User_Name"] == null)
        {
            return false;
        }
        else
        {
            UserID = (string)scom.Parameters["@User_ID"].Value;//.ToString();
            UserName = (string)scom.Parameters["@User_Name"].Value;//.ToString();
            myconn.Close();
            return true;
        }
    }
    catch (Exception e)
    { 
        string error = e.InnerException + e.Message; 
    }
    finally 
    { 
        myconn.Close();
    }

    return false;
}

Sql:

Create procedure dbo.AuthenticatePhone

  @phoneNumber numeric(11,0)        ,
  @User_ID     varchar(8)    output ,
  @User_Name   varchar(120)  output
as
begin

  Select @User_ID   = convert(varchar(8),[User_ID]) ,
         @User_Name = [User_Name]
  from dbo.NRE_Users
  where PhoneNumber = @phoneNumber
  ;

  print @User_ID
  print @User_Name

end

【问题讨论】:

  • 你试过使用SqlDbType.VarChar吗? Char 与您的过程定义不匹配。
  • 是的,我检查了 VarChar,但它不起作用。
  • @User_Name 是否返回其所有字符?
  • 不,它没有返回。我不确定可能是什么问题。现在我没有使用存储过程。我正在通过 sql 适配器执行 sql 查询。

标签: c# sql-server parameters output


【解决方案1】:

尝试使用以下代码:

Parameter[param number].Size = 200;

【讨论】:

    【解决方案2】:

    不适合我。给定这个存储过程:

    create procedure dbo.AuthenticatePhone
    
      @phoneNumber numeric(11,0)        ,
      @User_ID     varchar(8)    output ,
      @User_Name   varchar(120)  output
    
    as
    
      set @User_ID   = '1234567890' -- should be truncated to '12345678'
      set @User_Name = 'The quick brown fox jumped over the lazy dog.'
    
      return 0
    go
    

    在 SSMS 中运行此 SQL:

     declare @userId   varchar(1000) = 'xxx'
     declare @userName varchar(1000) = 'yyy'
     exec AuthenticatePhone 1 , @User_ID = @userId out , @User_Name = @userName out
     select @userId,@userName
    

    产生预期的结果:

    • @userId 包含预期的 12345678
    • @userName 包含预期的 The quick brown fox jumped over the lazy dog.

    通过 C# 执行:

    using ( SqlConnection connection = new SqlConnection( "Server=localhost;Database=sandbox;Trusted_Connection=True;" ) )
    using ( SqlCommand    command    = connection.CreateCommand() )
    {
    
      command.CommandType = CommandType.StoredProcedure;
      command.CommandText = "dbo.AuthenticatePhone" ;
    
      SqlParameter phoneNumber = new SqlParameter {
        ParameterName = "@phoneNumber"           ,
        IsNullable    = true                     ,
        Direction     = ParameterDirection.Input ,
        Value         = 2125551212L              ,
        } ;
      command.Parameters.Add( phoneNumber ) ;
    
      SqlParameter userId = new SqlParameter {
        ParameterName = "@User_ID"                ,
        IsNullable    = true                      ,
        Direction     = ParameterDirection.Output ,
        DbType        = DbType.String             ,
        Size          = 1000                      ,
        Value         = DBNull.Value              ,
        } ;
      command.Parameters.Add( userId ) ;
    
      SqlParameter userName = new SqlParameter {
        ParameterName = "@User_Name" ,
        IsNullable    = true ,
        Direction     = ParameterDirection.Output ,
        DbType        = DbType.String ,
        Size          = 1000 ,
        Value         = DBNull.Value ,
        } ;
      command.Parameters.Add( userName ) ;
    
      connection.Open() ;
      int rowsAffected = command.ExecuteNonQuery() ;
      connection.Close() ;
    
      Console.WriteLine( "Rows Affected: {0}"     , rowsAffected             ) ;
      Console.WriteLine( "User ID:       {{{0}}}" , userId.Value   as string ) ;
      Console.WriteLine( "User Name:     {{{0}}}" , userName.Value as string ) ;
    
    }
    

    同样的结果是预期的

    Rows Affected: -1
    User ID:       {12345678}
    User Name:     {The quick brown fox jumped over the lazy dog.}
    

    甚至替换你的参数定义:

    command.Parameters.Add("@phoneNumber", SqlDbType.BigInt).Value = 2125551212L ;
    command.Parameters.Add("@User_ID", SqlDbType.Char, 8).Direction = ParameterDirection.Output;
    command.Parameters.Add("@User_Name", SqlDbType.Char, 120).Direction = ParameterDirection.Output;
    

    你得到了预期的结果。

    尽管您可能会注意到 SqlDbType.Char 是 SQL char(X)。它相当于 T-SQL 中的 `convert(char(120),'John Doe')。 .Net 字符串将以指定长度填充空格。

    您可能会考虑将类型说明符更改为SqlDbType.VarChar:它将匹配存储过程中的参数声明并且您不会发现自己需要从字符串中修剪尾随空格以使其成为有用。

    【讨论】:

    • 嗨 Nicholas,我会再试一次。抱歉,我用 Char 发布了代码(实际上我正在使用各种选项进行测试)。早些时候它是 VerChar,它不起作用。我现在再试一次,然后告诉你。
    • 嗨 Nicholas,我尝试使用 VarChar,但没有成功。
    【解决方案3】:

    SqlDbType.Char 更改为SqlDbType.VarChar

    这里:

    scom.Parameters.Add("@User_ID", SqlDbType.Char, 8).Direction = ParameterDirection.Output;
    
    scom.Parameters.Add("@User_Name", SqlDbType.Char, 120).Direction = ParameterDirection.Output;
    

    【讨论】:

      【解决方案4】:

      据我所知,.net 中的字符只有一个字符长。所以你需要将参数类型更改为varchar

      scom.Parameters.Add("@User_ID", SqlDbType.Varchar, 8).Direction = ParameterDirect
      

      【讨论】:

      • 小错字:SqlDbType.VarChar 而不是SqlDbType.Varchar
      • SqlDbType 是涉及的 SQL 数据类型。不是 CLR 数据类型。
      • 嗨,对不起,它实际上是 VarChar(我错误地写成 Char),但它不起作用。
      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多