C# 在C中将SqlDataReader列值转换为json字符串

C# 在C中将SqlDataReader列值转换为json字符串,c#,.net,json,ado.net,C#,.net,Json,Ado.net,如果基于SQLDataReader读取的输出,字符串不是理想的,我希望输出一个字符串或其他可能的变量类型。我一直在玩while循环,while阅读器。阅读 我需要用json.net序列化一些东西 这是我当前的代码-它输出到调试日志,只是为了确保我成功地从数据库中读取 protected void Page_Load(object sender, EventArgs e) { string connectionString = "Data Source =.\\SQLEX

如果基于SQLDataReader读取的输出,字符串不是理想的,我希望输出一个字符串或其他可能的变量类型。我一直在玩while循环,while阅读器。阅读

我需要用json.net序列化一些东西

这是我当前的代码-它输出到调试日志,只是为了确保我成功地从数据库中读取

protected void Page_Load(object sender, EventArgs e)
    {

        string connectionString = "Data Source =.\\SQLEXPRESS; Initial Catalog = TeamProject; Integrated Security = True; MultipleActiveResultSets = True";

        string querystring = "RosterMake";

        using (SqlConnection connection = 
            new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(querystring, connection);
            command.CommandType = CommandType.StoredProcedure;

            try
            {
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    System.Diagnostics.Debug.WriteLine("\t{0}\t{1}\t{2}",
                    reader[0], reader[1], reader[2]);

                    //  What do I put here to make the results something I can 
                    //  serialize with json.net???

                }
                reader.Close();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("oops");
            }
        }
    }
}
提前谢谢

只需在SqlDataReader上使用GetString方法即可。你想要这样的东西:

string myString;

using (SqlDataReader rdr = command.ExecuteReader())
{
    do
    {
        while (rdr.Read())
        {
            myString = rdr.GetString(0);
        }
    } while (rdr.NextResult());
}
[
    {
        "Name": "John", Age: 30, Sex: "M"
    },
    {
        "Name": "Maria", Age: 28, Sex: "F"
    }
]
注意,这只是盲目地读取字符串,直到什么都没有了。由您来正确地输入逻辑。

只需在SqlDataReader上使用GetString方法即可。你想要这样的东西:

string myString;

using (SqlDataReader rdr = command.ExecuteReader())
{
    do
    {
        while (rdr.Read())
        {
            myString = rdr.GetString(0);
        }
    } while (rdr.NextResult());
}
[
    {
        "Name": "John", Age: 30, Sex: "M"
    },
    {
        "Name": "Maria", Age: 28, Sex: "F"
    }
]
注意,这只是盲目地读取字符串,直到什么都没有了。由您来正确输入逻辑。

您可以返回一个列表:

 public List<EnEntity> methodname(string pParam1)
    {
        try
        {
            List<EnEntity> ListEntity = new List<EnEntity>();
            SqlCommand cmd = new SqlCommand("sp_name", conexion);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@vParam", SqlDbType.VarChar).Value = pParam1;

            SqlDataReader drd = cmd.ExecuteReader();

            if (drd.HasRows)//!=null
            {
                int pos_iIndex = drd.GetOrdinal("iColumnaName");
                while (drd.Read())
                {
                    EnEntity oEnEntity = new EnEntity();

                    oEnEntity.iPropertie = drd.IsDBNull(pos_iIndex) ? 0 : drd.GetInt32(pos_iIndex);

                    ListEnEntity.Add(oEnEntity);
                }
                drd.Close();

            }
            return (ListEnEntity);
        }
        catch (Exception ex)
        {                
            throw ex;
        }
    }
您可以返回一个列表:

 public List<EnEntity> methodname(string pParam1)
    {
        try
        {
            List<EnEntity> ListEntity = new List<EnEntity>();
            SqlCommand cmd = new SqlCommand("sp_name", conexion);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@vParam", SqlDbType.VarChar).Value = pParam1;

            SqlDataReader drd = cmd.ExecuteReader();

            if (drd.HasRows)//!=null
            {
                int pos_iIndex = drd.GetOrdinal("iColumnaName");
                while (drd.Read())
                {
                    EnEntity oEnEntity = new EnEntity();

                    oEnEntity.iPropertie = drd.IsDBNull(pos_iIndex) ? 0 : drd.GetInt32(pos_iIndex);

                    ListEnEntity.Add(oEnEntity);
                }
                drd.Close();

            }
            return (ListEnEntity);
        }
        catch (Exception ex)
        {                
            throw ex;
        }
    }
您可以使用一个列表来保存这些值并将其序列化。Json将把它序列化为一个简单的Json。请参见代码示例和注释:

// define the list
var values = new List<Dictionary<string, object>>();
try
{
    connection.Open();
    // Use the using block to make sure you are disposing the dataReader object.
    using (SqlDataReader reader = command.ExecuteReader())
    {
        do
        {               
            while (reader.Read())
            {
                // define the dictionary
                var fieldValues = new Dictionary<string, object>();

                // fill up each column and values on the dictionary                 
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    fieldValues.Add(reader.GetName(i), reader[i]);
                }

                // add the dictionary on the values list
                values.Add(fieldValues);

            }
        } while (reader.NextResult());   // if you have multiple result sets on the Stored Procedure, use this. Otherwise you could remove the do/while loop and use just the while.
    }
}
catch (Exception ex)
{
    System.Diagnostics.Debug.WriteLine("oops");
}
您可以使用一个列表来保存这些值并将其序列化。Json将把它序列化为一个简单的Json。请参见代码示例和注释:

// define the list
var values = new List<Dictionary<string, object>>();
try
{
    connection.Open();
    // Use the using block to make sure you are disposing the dataReader object.
    using (SqlDataReader reader = command.ExecuteReader())
    {
        do
        {               
            while (reader.Read())
            {
                // define the dictionary
                var fieldValues = new Dictionary<string, object>();

                // fill up each column and values on the dictionary                 
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    fieldValues.Add(reader.GetName(i), reader[i]);
                }

                // add the dictionary on the values list
                values.Add(fieldValues);

            }
        } while (reader.NextResult());   // if you have multiple result sets on the Stored Procedure, use this. Otherwise you could remove the do/while loop and use just the while.
    }
}
catch (Exception ex)
{
    System.Diagnostics.Debug.WriteLine("oops");
}

将SqlDataReader转换为JSON很简单。要拥有的东西是Newtonsoft.Json;这里的图书馆就是一个例子

            SqlDataReader rdr = cmd.ExecuteReader();
            //sqlDatoToJson(rdr);
            var datatable = new DataTable();
            datatable.Load(rdr);
            string JsonResponse = string.Empty;
            JsonResponse = JsonConvert.SerializeObject(datatable);
            System.Diagnostics.Debug.WriteLine("3");
            System.Diagnostics.Debug.WriteLine(rdr);
            con.Close();
            return new JsonResult() { Data = JsonResponse,JsonRequestBehavior = JsonRequestBehavior.AllowGet };

将SqlDataReader转换为JSON很简单。要拥有的东西是Newtonsoft.Json;这里的图书馆就是一个例子

            SqlDataReader rdr = cmd.ExecuteReader();
            //sqlDatoToJson(rdr);
            var datatable = new DataTable();
            datatable.Load(rdr);
            string JsonResponse = string.Empty;
            JsonResponse = JsonConvert.SerializeObject(datatable);
            System.Diagnostics.Debug.WriteLine("3");
            System.Diagnostics.Debug.WriteLine(rdr);
            con.Close();
            return new JsonResult() { Data = JsonResponse,JsonRequestBehavior = JsonRequestBehavior.AllowGet };


和如果不使用sqldatareader,请使用SqlDataAdapter。填充一个DataTable,DataTable很容易转换为XML。这个问题与sqldatareader有什么关系?这不只是关于如何将字符串转换为json对象吗?您展示了很多代码,但实际上您需要一个json教程。Newtonsoft.json将帮助您,只需要创建一个表示所需json格式的类,然后用reader[i]填充列表values@TimSchmelter这里的问题是将其存储在我可以使用json.net访问的地方。除非您知道如何将SQLDataReader直接传递给json。。。我只是不知道最好的存储方式是什么,这样我以后可以序列化它。@KeltonCrouse:SqlDataReader读取来自数据库的数据,并给你一个对象。它有reader.GetString0之类的方法,可以为您提供正确的类型。但是您必须自己处理这个字符串,datareader没有自动性。但是您是否尝试过:JObject.Parsereader.GetString0?和。。如果不使用sqldatareader,请使用SqlDataAdapter。填充一个DataTable,DataTable很容易转换为XML。这个问题与sqldatareader有什么关系?这不只是关于如何将字符串转换为json对象吗?您展示了很多代码,但实际上您需要一个json教程。Newtonsoft.json将帮助您,只需要创建一个表示所需json格式的类,然后用reader[i]填充列表values@TimSchmelter这里的问题是将其存储在我可以使用json.net访问的地方。除非您知道如何将SQLDataReader直接传递给json。。。我只是不知道最好的存储方式是什么,这样我以后可以序列化它。@KeltonCrouse:SqlDataReader读取来自数据库的数据,并给你一个对象。它有reader.GetString0之类的方法,可以为您提供正确的类型。但是您必须自己处理这个字符串,datareader没有自动性。但是你试过这个:JObject.Parsereader.GetString0吗?如果所有变量和方法都用英语命名会更好,否则它们对那些不了解世界的人来说意味着一个谜,比如:ListarReporteSegunPeriodoFechai,我希望这对你有帮助如果所有变量和方法都用英语命名会更好,否则,对于那些不了解世界的人来说,这意味着一个谜,比如:ListarReporteSegunPeriodoFechai,我希望这能帮助你,如果记录集的形状不同,这是如何工作的,在多个记录集的情况下?因为它可以反序列化为一个列表。所以得到两个数组?字典是一种密钥对值数据结构。它将反序列化单个对象,如{name:'Charles',lastName:'Okwuagwu}。string`是项目名称,object是值。该值必须是object,因为它可以是字符串、数字等。。如果json上有一个列表,那么可以为许多对象定义一个列表。这就是为什么它有效。谢谢,我找到了另一个选择。我使用WriteStarray;和写达雷;界定每个下一个结果;在多个记录集的情况下,如果记录集的形状不同,这是如何工作的?因为它可以反序列化为一个列表。因此得到两个数组?字典是一种密钥对值数据结构。它将反序列化单个对象,如{name:'Charles',lastName:'Okwuagwu}。string`是项目名称,object是值。该值必须是object,因为它可以是字符串、数字等。。如果您在json上有一个列表,那么y
为许多对象定义一个列表。这就是为什么它有效。谢谢,我找到了另一个选择。我使用WriteStarray;和写达雷;界定每个下一个结果;分成不同的数组