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
Ответ Тима Шмельтера приятный и очень подробный, но я думаю, что это многое для того, что вы хотите.