【问题标题】:Retrieving VarChar(MAX) from SQL Server using C# and a stored procedure使用 C# 和存储过程从 SQL Server 检索 VarChar(MAX)
【发布时间】:2013-07-10 08:55:16
【问题描述】:

我有一个 WebMethod,它被调用来从 SQL Server 检索 varchar(max) 列。我创建了我需要的存储过程,它在 Management Studio 中运行良好,但是当我运行以下代码时出现错误:

不存在数据时尝试读取无效

代码:

[WebMethod]
public static void PopulatePopUp(string arg)
{
    var str = GlobalStatic.ExceptBlanks(arg);

    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["Conn"].ConnectionString);

    SqlDataReader rdr = null;

    using (conn)
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            conn.Open();

            cmd.CommandText = "GetMessage_Sel";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@messageId", SqlDbType.VarChar, -1).Value = str;
            cmd.Parameters.Add("@RowCount", SqlDbType.Int).Direction = ParameterDirection.Output;

            cmd.Connection = conn;

            try
            {
                rdr = cmd.ExecuteReader();

                if (rdr.HasRows)
                {
                    string fieldValue = rdr.GetString(0);
                }
                else
                {
                    Console.WriteLine("No rows found.");
                }

                rdr.Close();
            }
            catch (Exception err)
            {
                // handle the error
                //messageInsert = false;
            }
            finally
            { 
                conn.Close(); 
            }
        }
    }
}

【问题讨论】:

  • 可以发一下流程吗?
  • 嗯,你需要在某处拨打rdr.Read()

标签: c# datareader varcharmax


【解决方案1】:

试试这个

                    if (rdr.HasRows)
                    {
                        while(rdr.Read())
                        {
                            string fieldValue = rdr[0].ToString();
                        }

                    }
                    else
                    {
                        Console.WriteLine("No rows found.");
                    }

【讨论】:

  • 小学生错误。多谢你们。更改我的代码以接受阅读(我是白痴)我现在遇到了演员表问题。 Int32 到一个字符串。我的印象是声明中的 -1 是 Varchar(max)
【解决方案2】:

根据您期望的行,您将需要调用 Read 方法,该方法实际上会为您获取结果,因此这种情况应该很好,因为只有在有一行要读出时它才会进入

while(rdr.Read())
{...}

if(rdr.Read())
{ ...}

【讨论】:

    【解决方案3】:

    发生这种情况是因为您还没有阅读下一条记录。

    改变

    if (rdr.HasRows)
    {
        string fieldValue = rdr.GetString(0);
    }
    

    if (rdr.Read())
    {
        string fieldValue = rdr.GetString(0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2020-09-20
      • 2014-07-29
      • 2017-03-14
      • 2017-08-11
      • 1970-01-01
      相关资源
      最近更新 更多