【问题标题】:How to get data in string from database如何从数据库中获取字符串中的数据
【发布时间】:2015-02-19 14:43:33
【问题描述】:

我正在开发 android 客户端和 .NET 服务器应用程序,其中我将数据解析为 xml,然后转换为字符串,然后将此字符串发送到 android 客户端。现在我在以 xml 格式从 SQL Server 获取数据时遇到问题并将其转换为字符串。这是我的代码..

 UserLogin userLogin = converter.GetObjectFromXml<UserLogin>(xml);
    String query = @"Select StdBD.First_NameEn As name from TblStudentBioData As StdBD Join TblStudentDetail As StdDet ON StdBD.Student_ID = StdDet.Student_ID
       join TblClassSchedule As ClsSch on StdDet.ClassID = ClsSch.ClassSchID
     join TblClass As Cls on ClsSch.ClassID = Cls.ClassID 
     join TblSemAssigning As SemAs on SemAs.SemAssId = ClsSch.SemAssId
     join TblAcademicYear As Acd on SemAs.AcademicYearId = Acd.AcademicYearId
     where Acd.AcademicYearId = " + userLogin.userId + "FOR XML RAW('Student'),Root('Students'),Elements";
     String outputXml = General.ExecuteSimpleSelectQuery(General.connectionString, query, "Table user");
                   Console.WriteLine("xmllll = "+outputXml);

和

   class General
   {
    public static String ServerIp = "192.168.1.2";
    public static String ServerPort = "8060";
    public static String connectionString =    NetService2.Properties.Settings.Default.ConnString.ToString();

    public static String ExecuteSimpleSelectQuery(string ConnectionString, string _Query, string DataTableName)
    {      
        SqlConnection conn = new SqlConnection(ConnectionString);            
        SqlCommand cmd = new SqlCommand(_Query,conn);
        SqlDataReader reader = null;          
        conn.Open();
        reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine("name = " + reader[0].ToString());
        }
        reader.Close();
        conn.Close();
        return "";
    }

输出:

通过使用此代码,我在 SqlDataReader 实例中获取数据,但不是在字符串中,所以有没有办法直接将数据获取到字符串或将 SqlDataReader 实例数据转换为字符串,所以我可以使用它。

我想要这样的输出:

String xml = "<Students>
  <Student>
    <name>Aliya</name>
  </Student>
  <Student>
    <name>Fahad</name>
  </Student>
  <Student>
    <name>iqra</name>
  </Student>
  <Student>
    <name>iqra</name>
  </Student>
  <Student>
    <name>khurram</name>
  </Student>
  <Student>
    <name>Zainab</name>
  </Student>
  <Student>
    <name>Fatima</name>
  </Student>
  <Student>
    <name>Fahad</name>
  </Student>
</Students>";

将这个硬编码的 xml 替换为 xml,从数据库中获取。

【问题讨论】:

标签: c# sql sql-server xml


【解决方案1】:

只需在 DataTable 中获取您的 XML 数据,它就会在其第一个位置为您提供一个 xml,然后将其转换为字符串。

    SqlConnection conn = new SqlConnection(yourConnectionString);            
    SqlCommand cmd = new SqlCommand(your query,conn);
    SqlDataAdapter SDA = new SqlDataAdapter();
    DataTable dt = new DataTable(DataTableName);
    conn.Open();
    SDA.Fill(dt);
    conn.Close();
    String xml =  dt.Rows[0].ItemArray[0].ToString();
    return xml;

【讨论】:

    【解决方案2】:

    简单地将您的查询放入存储过程中

     Create PROCEDURE yourprocedurename
     AS
     BEGIN
     Select StdBD.First_NameEn As name from TblStudentBioData As StdBD 
     Join TblStudentDetail As StdDet ON StdBD.Student_ID = StdDet.Student_ID
     join TblClassSchedule As ClsSch on StdDet.ClassID = ClsSch.ClassSchID
     join TblClass As Cls on ClsSch.ClassID = Cls.ClassID 
     join TblSemAssigning As SemAs on SemAs.SemAssId = ClsSch.SemAssId
     join TblAcademicYear As Acd on SemAs.AcademicYearId = Acd.AcademicYearId
     where Acd.AcademicYearId = " + userLogin.userId + "FOR XML 
     RAW('Student'),Root('Students'),Elements";
     END
    

    从编码方面做这样的事情

    public static String ExecuteSimpleSelectQuery(string ConnectionString, 
                                      string _Query, string DataTableName)
        {      
            SqlConnection conn = new SqlConnection(ConnectionString);            
            SqlCommand cmd = new SqlCommand("yourstoredprocedurename",conn);
            SqlDataAdapter SDA = new SqlDataAdapter();
            DataTable dt = new DataTable(DataTableName);
            conn.Open();
            cmd.CommandType = CommandType.StoredProcedure;
            SDA.SelectCommand = cmd;
            SDA.Fill(dt);
            conn.Close();
            return dt.Rows[0].ItemArray[0].ToString();
        }
    

    希望它能为您提供所需的输出

    【讨论】:

      【解决方案3】:

      您可以在将所有记录加载到List&lt;string&gt; 后使用String.Join:

      public static String ExecuteSimpleSelectQuery(string ConnectionString, string _Query, string DataTableName)
      {
          List<string> list = new List<string>();
          using(SqlConnection conn = new SqlConnection(ConnectionString))
          using (SqlCommand cmd = new SqlCommand(_Query, conn))
          {                
              conn.Open();
              using (var reader = cmd.ExecuteReader())
              {
                  while (reader.Read())
                  {
                      list.Add("name = " + reader.GetString(0));
                  }
              }
          }
          return string.Join(Environment.NewLine, list);
      }
      

      但是,不要对您的 sql 命令使用字符串连接,因为您很容易受到 sql-injection 的攻击。所以不要将查询传递给方法ExecuteSimpleSelectQuery。而是使用 sql 参数。

      【讨论】:

        【解决方案4】:

        您的函数将始终返回空字符串,因为您在每次调用函数后返回 ""。尝试将您的功能更改为:

        public static String ExecuteSimpleSelectQuery(string ConnectionString, string _Query, string DataTableName)
            {      
                SqlConnection conn = new SqlConnection(ConnectionString);            
                SqlCommand cmd = new SqlCommand(_Query,conn);
                    string result;
                conn.Open();
                var dt = new DataTable();
                dt.Load( cmd.ExecuteReader());
        
        
                using (StringWriter sw = new StringWriter()) {
                dt.WriteXml(sw);
                 result = sw.ToString();
               }
        
                conn.Close();
                return result;
            }
        

        【讨论】:

          【解决方案5】:

          是的,您可以将列数据捕获到string。默认情况下,您的所有数据类型都将被视为object。这意味着您必须:

          • 使用SqlDataReader 内置函数。
          • 使用ToString()
          • 使用(string) 或as string 演员表。

          在我提供示例之前,您应该在尝试处理数据之前做一些事情,检查null。

          if(reader[0] != DBNull.Value)
          {
               // Do Something...
          }
          

          原因是,如果您对数据执行某些操作,您将收到 Exception。另一个有用的东西,不是使用[0],而是使用["NameOfColumn"],稍后维护代码,这将使特定数据更易于阅读并查看它的作用。

          if(reader["NameOfColumn"] != DBNull.Value)
               example = reader["NameOfColumn"].ToString();
          
          if(reader["NameOfColumn"] != DBNull.Value)
               example = (string)reader["NameOfColumn"];
          
          example = reader["NameOfColumn"] as string;
          

          这些是一些原始示例,最后一个如果失败将分配一个null。因此,您需要预测代码中可能出现的冒泡。第一个例子,是最常见和最简单的。

          但是,如果您想避免重复上述代码。

          public static class DataReaderExtension
          {
               public static string GetStringOrNull(this IDataReader reader, int ordinal)
               {
                    var value = null;
                    if(!reader.IsDBNull(reader.GetOrdinal(ordinal)
                         reader.GetString(ordinal);
          
                    return value;
               }
          
               public static string GetStringOrNull(this IDataReader reader, string columnName)
               {
                    return reader.GetStringOrNull(reader.GetOrdinal(columnName));
               }
          }
          

          这是几种不同的方法。希望这确实对您有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-04-03
            • 2012-05-15
            • 1970-01-01
            • 1970-01-01
            • 2018-06-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多