VB.NET,两条SQL命令,构建字符串
Posted
技术标签:
【中文标题】VB.NET,两条SQL命令,构建字符串【英文标题】:VB.NET, Two SQL command, build a string 【发布时间】:2014-01-28 20:41:51 【问题描述】:我正在使用 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
迈克;16
我该怎么做?我知道我必须使用 StringBuilder 然后 AppendLine(),但问题/问题更多:如何将 NAME 和 AGE 放在一行中? 我怎样才能优雅地解决这个问题? 我希望你能帮助我。谢谢! BK_
更新:
不,他们没有任何关系。我正在使用 Sql Server CE。
如果有一个表更新可能,那就太好了。这意味着,如果我可以将这两个表更新为一个表,例如:
Tbl_personality 列名和列龄
然后使用 SQL * FROM tbl_personality 立即读取它
【问题讨论】:
问题是这些表是如何相关的,table_age
中是否有外键指向tbl_name
?然后您可以使用JOIN
和单个查询。
有什么可以告诉你 14 岁属于詹姆斯的吗?还是您只是根据查询返回的顺序将它们粘在一起?请记住,SQL 不保证排序顺序,您的示例可能会说 James 一次是 14 岁,下一次是 16 岁。
大家好,谢谢您的回答。 TimSchmelter 我更新了我的问题。 Rozwel 谢谢你的提醒。也许更新可能是更好的解决方案。请看我的问题。我更新了。
【参考方案1】:
问题是这些表是如何关联的,table_age
中是否有一个外键指向tbl_name
?然后您可以使用JOIN
和单个查询。
您可以填写List<User>
,其中User
是具有这两个属性的自定义类:
public class User
public string Name get; set;
public int Age get; set;
现在使用INNER JOIN
链接 FK 上的两个表,您可以得到每个名字的正确年龄:
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
【讨论】:
感谢蒂姆的回答。但正如 Rozwel 已经提到的,SQL 不保证排序顺序。这就是为什么将这两个表合二为一而不是阅读它可能是更好的解决方案。但是我怎样才能更新这些条目呢? @Bk_:如果您提供ORDER BY
(如我的回答所示),SQL 确实保证排序。但是在这种情况下顺序并不重要,您需要一种通过JOIN
(见上文)链接两个表或单独使用单个表的方法。当然,您可以使用UPDATE tbl_personality
或INSERT INTO tbl_personality
,但不清楚哪个年龄属于哪个名字。请记住,数据库中没有隐式顺序。
嗯..好的..非常感谢!【参考方案2】:
一个主键/外键会很好,但是如果你只是想玩转字符串连接你可以更容易地做到这一点......
正如你已经说过的那样,你在两者上都做了 SQLCEReader,所以你有两个数据。
要将它们组合在一起,只需将一条阅读器线与另一条阅读器线一起使用
sqlDataReader1("Name") & ";" & sqlDataReader2("Age")
输出将是
James;14
如你所愿
如果你将它们放在不同的 subs 中,你可以将它们组合成 1 或只使用一些变量然后组合变量
dim namestr as string = string.empty
dim agestr as string = string.empty
然后你把它交给你的字符串变量
namestr = sqlDataReader1("Name")
agestr = sqlDataReader2("Age")
然后合并
namestr & ";" & agestr
输出也是
James;14
Tim Schmelter 的回答很好而且非常详细,但我认为它对于你想要的东西来说已经足够了。
【讨论】:
以上是关于VB.NET,两条SQL命令,构建字符串的主要内容,如果未能解决你的问题,请参考以下文章
使用 vb.net 的字符串 sql 格式不正确插入失败?如何
SQL 查询字符串在 SQL Server Management Studio 中有效,但在带有 SQLCommand.ExecuteReader 的 VB.net 中无效