【问题标题】:SQL Selecting between 3 tables- Cannot convert to int errorSQL 在 3 个表之间选择 - 无法转换为 int 错误
【发布时间】:2019-03-13 19:52:22
【问题描述】:

我遇到了嵌套 SQL 代码的问题。它基于 Nvarchar 获取一个 INT 变量,我不明白为什么这会返回错误,所以可以使用你的帮助。

我有一个表结构如下-

  • SONGS_DB SONG_ID、SONG_NAME

  • SONG_PLAYLIST SONG_PLAYLIST_ID、SONG_ID、PLAYLIST_ID

  • 播放列表 PLAYLIST_ID,PLAYLIST_NAME

我正在尝试使用以下代码从一个播放列表中获取所有歌曲以显示在 datagridviewer 中-

Dim con As New SqlConnection With {.ConnectionString = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\coolj\OneDrive\Documents\Loop\Loop\Songs_SQL.mdf;Integrated Security=True"}
    Dim cmd As New SqlCommand("SELECT SONG_ID, SONG_NAME FROM SONGS_DB WHERE SONG_ID IN (SELECT SONG_ID FROM SONG_PLAYLIST WHERE PLAYLIST_ID IN (SELECT PLAYLIST_ID FROM Playlist WHERE PLAYLIST_NAME = (@NAME)))", con)
    cmd.Parameters.AddWithValue("@NAME", ComboBox1.SelectedIndex)

    Dim Ada As New SqlDataAdapter(cmd)
    Dim Table As New DataTable()
    Ada.Fill(Table)

    DataGridView1.DataSource = Table
End Sub

但是它返回以下错误-

'将 nvarchar 值 'Party Hits' 转换为数据类型 int 时转换失败。'

派对点击是第一个播放列表的名称,我对此感到困惑,因为我认为没有理由将派对点击转换为 int。有什么想法吗?

【问题讨论】:

  • 尝试使用 selecteditem 而不是 selectedindex,您正在将 int 与 SQL 中的文本字段进行比较
  • 请说明如何填充 ComboBox1 项目集合。你使用 DataSource 还是 Items.Add ?
  • PLAYLIST_NAME 似乎包含一个“名称”,其中 .SelectedIndex 应该是一个 int。我错过了什么?

标签: sql vb.net tsql


【解决方案1】:

这一行

 cmd.Parameters.AddWithValue("@NAME", ComboBox1.SelectedIndex)

返回组合框中当前选定项的索引。这是一个数字而不是播放列表的名称。

如果您想获取该播放列表的名称,您可以使用

 cmd.Parameters.AddWithValue("@NAME", ComboBox1.SelectedItem.ToString())

但要使用的确切属性取决于您如何初始化 ComboBox 内容。
如果您一次添加一个播放列表一个名称,您可以使用上述方法,但如果您填充 DataSource,则需要考虑从用于填充数据源的对象集合中提取信息

例如,如果使用此代码中的 DataTable 填充组合

Dim con As New SqlConnection With {.ConnectionString = "....."}
Dim cmd As New SqlCommand("SELECT * FROM Playlist", con)
Dim Ada As New SqlDataAdapter(cmd)
Dim Table As New DataTable()
Ada.Fill(Table)

' Here the collection of items is a collection of DataRowView
' and we tell the ComboBox what to display and what to use for the SelectedValue property
ComboBox1.DisplayMember = "PLAYLIST_NAME"
ComboBox1.ValueMember = "PlayList_ID"
ComboBox1.DataSource = Table

然后你可以用

检索你的名字
Dim drv As DataRowView = CType(ComboBox1.SelectedItem, DataRowView)
Dim name as String = drv("Name").ToString()

作为最后一条建议,我建议您更改查询并使用更“简单”和标准的连接语句

SELECT S.SONG_ID, S.SONG_NAME 
FROM SONGS_DB S 
   LEFT JOIN SONG_PLAYLIST SP ON S.SONG_ID = SP.SONG_ID
   LEFT JOIN Playlist P ON SP.PlayList_ID = p.PlayList_ID
WHERE p.PLAYLIST_NAME = @NAME",

【讨论】:

  • 您好史蒂夫感谢您的回答,您的顶级评论确实解决了错误,但是 datagridviewer 仍然没有填充。感谢您的示例,但请记住,我希望使用歌曲名称和 id 填充网格,而不是播放列表,它位于单独的表格中
  • 好吧,您需要调试代码并检查变量中的值。例如,填写表格后检查 Table.Rows.Count 值是多少。
  • 我的第二个代码 sn-p 是一个示例,说明如何使用播放列表的名称填充 ComboBox1,而不是 DataGridView,而不使用循环逐个插入名称。它只是为了解释不同的加载方法需要不同的提取方法。如果您一一插入播放列表名称,则 SelectedItem.ToString 解析名称
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
相关资源
最近更新 更多