C # Чтение нескольких строк из разных столбцов, использующих один и тот же внешний ключ SQL - PullRequest
0 голосов
/ 23 сентября 2018

Мне нужен эффективный способ извлечения всей информации, которая использует один и тот же внешний ключ в таблице, и сохранения данных в списке / массиве.

Я могу прочитать несколько строк из одного столбца:

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

int idForeignKey = inputIdFkey //Implemented on the WebPage for testing purposes

List<string> result = new List<string>();
string oString = "Select Column from Table where foreignKey = @fKey";

conn.Open();
SqlCommand oCmd = new SqlCommand(oString, conn);
oCmd.Parameters.AddWithValue("@fKey", idForeignKey);
using (SqlDataReader oReader = oCmd.ExecuteReader())
{
    while (oReader.Read())
    {
        result.Add(oReader.GetString(0));
    }
}
conn.Close();

И я могу прочитать несколько столбцов, если нацеливаюсь на одну конкретную строку:

int sqlData1;
int sqlData2;
int sqlData3;

string oString = "Select * from Table where TableID = @tId";
SqlCommand oCmd = new SqlCommand(oString, conn);
oCmd.Parameters.AddWithValue("@tId", 1001);
conn.Open();
using (SqlDataReader oReader = oCmd.ExecuteReader())
{
    while (oReader.Read())
    {
        sqlData1 = oReader["Row1"].ToString();
        sqlData2 = oReader["Row2"].ToString();
        sqlData3 = oReader["Row3"].ToString();
    }
}
conn.Close();

Но я хотел бы иметь возможность читать все / конкретные данные, имеющие одинаковый внешний ключ.Поэтому я хочу иметь возможность извлекать несколько строк, сохранять их в список и извлекать несколько других данных строк из другого столбца, который имеет один и тот же внешний ключ.

Я представляю, что-то вроде этого:

int idForeignKey = inputIdFkey //Implemented on the WebPage for testing purposes

List<int> intList = new List<int>();
List<string> stringList = new List<string>();
List<DateTime> dateList = new List<DateTime>();

string oString = "Select * from Table where ForeignKey = @fKey";

conn.Open();
SqlCommand oCmdSleep = new SqlCommand(oString, conn);
oCmdSleep.Parameters.AddWithValue("@fKey", idForeignKey);
using (SqlDataReader oReader = oCmdSleep.ExecuteReader())
{
    while (oReader.Read())
    {
        intList.Add(oReader["Column1"].GetDateTime(0));
        dstringList.Add(oReader["Column3"].GetDateTime(0));
        dateList.Add(oReader["Column4"].GetDateTime(0));
    }
}
conn.Close();

Но это не работает ... Пожалуйста, посоветуйте мне

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Не нужно указывать имя столбца, просто используйте уже установленный индекс:

int idForeignKey = inputIdFkey //Implemented on the WebPage for testing purposes

List<int> intList = new List<int>();
List<string> stringList = new List<string>();
List<DateTime> dateList = new List<DateTime>();

string oString = "Select * from Table where ForeignKey = @fKey";

conn.Open();
SqlCommand oCmdSleep = new SqlCommand(oString, conn);
oCmdSleep.Parameters.AddWithValue("@fKey", idForeignKey);
using (SqlDataReader oReader = oCmdSleep.ExecuteReader())
{
    while (oReader.Read())
    {
        intList.Add(oReader.GetDateTime(0));
        dstringList.Add(oReader.GetDateTime(3));
        dateList.Add(oReader.GetDateTime(4));
    }
}
conn.Close();

Вот разбивка:

listVariable.Add(oReader.GetDataType("Index of column"));

Таким образом, вы получаете, чтобы получить вседанные строки для общего внешнего ключа и возможность сделать это для любого количества столбцов.

0 голосов
/ 23 сентября 2018

Если вы используете что-то вроде Dapper , это упростит отображение вашего запроса на List<T>.

Добавьте Dapper в ваш проект, используя nuget.

Install-Package Dapper -Version 1.50.5

Добавьте использование для Dapper вверху класса, в котором вы выполняете запрос.

using Dapper;

Добавьте класс, соответствующий структуре результатов вашего запроса.Есть способы сделать это, используя скрипт или служебное приложение. Вот приложение для этого.

public class MyClass
{
    public int MyId { get; set; }
    public string MyName { get; set; }
    public DateTime MyDateTime { get; set; }
}

Затем, когда вы запускаете запрос, сделайте так:

using (conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
   var MyList = conn.Query<MyClass>(@"select * from Table where ForeignKey = @fKey", 
       new { fKey = "SomeKey" }).ToList();
}

После выполнения запроса вы можете выполнить итерациючерез MyList.

foreach (var myItem in MyList)
{
    // Do something with myItem
}

Если вы хотите связать результаты, просто удалите .ToList() из конца запроса, поскольку по умолчанию это IObservable<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...