C#SQL选择查询只转储一列
本文关键字:一列 转储 选择 查询 C#SQL | 更新日期: 2023-09-27 17:52:55
我在连接SQL和运行一个简单的选择查询时遇到了问题,我需要将select * from ServerInfo where ServerID = 1991638835"
输出到控制台行或txt文件:
这是我的代码:
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Text;
namespace ConnectingToSQLC
{
class Program
{
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("server= XXXXX; database = ES1Archive; Integrated Security=false; User ID = sa; Password=XXXXXX");
conn.Open();
SqlCommand cmd = new SqlCommand("select * from ServerInfo where ServerID = 1991638835", conn);
SqlDataReader reader = cmd.ExecuteReader ();
while (reader.Read())
{
//Console.WriteLine ("{1}", "{0}", reader.GetString (0), reader.GetString (1));
Console.WriteLine(reader.GetString(3));
}
reader.Close();
conn.Close();
if (Debugger.IsAttached)
{
Console.ReadLine();
}
}
}
}
它运行良好。但如果我换成Console.WriteLine ("{1}", "{3}", reader.GetString (1), reader.GetString (3));
我总是有第2列。总共有7列,第3列为空,而第4列为XML。
如何修改代码以转储所有代码?
您有太多格式化字符串-将它们合并为一个字符串,例如:
Console.WriteLine ("{0} - {1}", reader.GetString(1), reader.GetString(3))
您正在使用的Console.WriteLine
重载的格式化字符串的索引与string.Format
类似-它不依赖于您在读取器中使用的索引,格式参数占位符只需要匹配其他params args
参数的顺序。
还有:
- 通常使用
SELECT *
是不好的做法,当您通过顺序索引访问数据读取器列时更危险,因为表中的更改会破坏读取器代码。相反,建议显式命名正在使用的列和/或使用reader
的列名访问器 - 如果读取器的唯一用途是
Console.WriteLine
上的字符串输出,则不需要使用Get<Type>()
重载-您可以简单地使用序数访问器(在使用显式列名SELECT
:-保证列的顺序之后(
例如,对于读卡器列1、3和6(当然是基于零(:
Console.WriteLine ("{0} - {1} - {2}", reader[1], reader[3], reader[6]);
但更好的是:
Console.WriteLine ("{0} - {1} - {2}", reader["RealNameOfCol1"],
reader["RealNameOfCol3"], reader["RealNameOfCol6"]);
您可以使用IDataRecord接口在循环中执行此操作:
class Program
{
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("server= XXXXX; database = ES1Archive; Integrated Security=false; User ID = sa; Password=XXXXXX");
conn.Open();
SqlCommand cmd = new SqlCommand("select * from ServerInfo where ServerID = 1991638835", conn);
SqlDataReader reader = cmd.ExecuteReader ();
while (reader.Read())
{
for(int i = 0; i<reader.FieldCount;i++)
{
Console.WriteLine(reader[i]);
}
}
reader.Close();
conn.Close();
if (Debugger.IsAttached)
{
Console.ReadLine();
}
}
}