VB.NET, две команды SQL, построить строку

Я кодирую программу с VB.NET (2010), которая работает с локальной базой данных (.sdf - SQL Server CE).

Теперь мне нужно выполнить две команды SELECT. Вот пример, чтобы понять, чего я хочу:

Пример команды SQL 1:

SELECT A FROM tbl_Name

Если я прочитаю этот результат с помощью SqlCeDataReader, я получу следующее:

Джеймс

Том

Майк

Пример команды SQL 2:

SELECT B FROM tbl_Age

Если я прочитаю этот результат с помощью SqlCeDataReader, я получу следующее:

14

15

16


Проблема в том, как я могу построить строку, которая содержит наконец значение, подобное этому ->

Джеймс, 14

Том, 15

Mike, 16

Как я могу это сделать? Я знаю, что мне нужно использовать StringBuilder, а затем AppendLine(), но проблема / вопрос в следующем: как мне объединить ИМЯ и ВОЗРАСТ в одной строке? Как я могу решить эту проблему элегантно? Я надеюсь, что вы можете мне помочь. Спасибо! BK_

Обновить:

Нет, они не имеют никакого отношения. Я работаю с SQL Server CE.

В противном случае было бы очень хорошо, если бы возможно обновление таблицы. Это означает, что если я смогу обновить обе эти таблицы в одну таблицу, например:

Имя столбца Tbl_personality и возраст столбца

И чем читать это сразу с SQL * ОТ tbl_personality

2 ответа

Решение

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

Вы могли бы заполнить List<User> где User пользовательский класс с обоими свойствами:

public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Теперь используйте INNER JOIN связать обе таблицы на ФК, и вы получите правильный возраст для каждого имени:

string sql = @"SELECT n.Name,a.Age 
               FROM tbl_Name n 
               INNER JOIN tbl_Age a 
                  ON n.NameID=a.NameID
               ORDER BY Name, Age";

Вы можете добавить экземпляры User в то время как вы читаете все записи:

List<User> users = new List<User>();
using (var con = new System.Data.SqlClient.SqlCeConnection("Connection-String"))
using (var cmd = new SqlCeCommand(sql, con))
{
    con.Open();
    using (var rd = cmd.ExecuteReader())
    {
        while (rd.Read())
        {
            string name = rd.GetString(0);
            int age = rd.GetInt32(1);
            users.Add(new User { Name = name, Age = age });
        }
    }
}

если вы хотите вывести все:

foreach (User u in users)
    Console.WriteLine("{0};{1}", u.Name, u.Age);

Изменить: здесь версия VB.NET:

Dim users As New List(Of User)()
Using con = New System.Data.SqlClient.SqlCeConnection("Connection-String")
    Using cmd = New SqlCeCommand(sql, con)
        con.Open()
        Using rd = cmd.ExecuteReader()
            While rd.Read()
                Dim name As String = rd.GetString(0)
                Dim age As Integer = rd.GetInt32(1)
                users.Add(New User() With { _
                    Key .Name = name, _
                    Key .Age = age _
                })
            End While
        End Using
    End Using
End Using

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

как вы уже заявили, вы сделали SQLCEReader на обоих, так что у вас есть обе данные.

Чтобы объединить их, просто используйте одну строку чтения с другой строкой чтения, как

sqlDataReader1("Name") & ";" & sqlDataReader2("Age")

выход будет

James;14

как ты хотел

Если у вас есть их в разных подпрограммах, вы можете объединить их в 1 или просто использовать некоторые переменные, а затем объединить переменные

dim namestr as string = string.empty
dim agestr as string = string.empty

Затем вы передаете его вашей строковой переменной

namestr = sqlDataReader1("Name")
agestr = sqlDataReader2("Age")

затем объединить

namestr & ";" & agestr

выход также будет

James;14

Ответ Тима Шмельтера приятный и очень подробный, но я думаю, что это многое для того, что вы хотите.

Другие вопросы по тегам