Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过使用sql查询将值插入sql数据库_C#_Sql - Fatal编程技术网

C# 通过使用sql查询将值插入sql数据库

C# 通过使用sql查询将值插入sql数据库,c#,sql,C#,Sql,这是我创建轨迹的第一行(这很有效) 然后我想使用刚刚为这首曲目创建的ID,我需要它,这样我就可以将它链接到其他内容(在本例中是一个流派。我在不同的表中指定了流派的名称,需要它们的ID) 我现在正在尝试,但它不起作用,我真的不知道该怎么办 using (var connection = Database.connection) { String Track1Genre = "INSERT INTO TrackGenre (TrackId, GenreId) VALUES (@TrackId

这是我创建轨迹的第一行(这很有效)

然后我想使用刚刚为这首曲目创建的ID,我需要它,这样我就可以将它链接到其他内容(在本例中是一个流派。我在不同的表中指定了流派的名称,需要它们的ID) 我现在正在尝试,但它不起作用,我真的不知道该怎么办

using (var connection = Database.connection)
{
    String Track1Genre = "INSERT INTO TrackGenre (TrackId, GenreId) VALUES (@TrackId, @GenreId)";
    string Genre = listBoxGenre.GetItemText(listBoxGenre.SelectedItem);
    using (SqlCommand sqlCmd = new SqlCommand(Track1Genre, connection))
    {

        sqlCmd.Parameters.AddWithValue("@TrackId", "Select Id from Track WHERE Titel = textBoxTitel.Text");
        sqlCmd.Parameters.AddWithValue("@GenreId", "Select Id from Genre where Genre = Genre");
        sqlCmd.ExecuteNonQuery();
    }
}

注意:连接或任何东西都没有问题,我只需要帮助如何从数据库中取出ID并将其插入另一个表中

我不知道这是一个打字错误还是真正的错误,需要更正

这一行来自您的代码

 sqlCmd.Parameters.AddWithValue("@TrackId", "Select Id from Track WHERE Titel = textBoxTitel.Text");
应该这样写

 sqlCmd.Parameters.AddWithValue("@TrackId", "Select Id from Track WHERE Titel = " + textBoxTitel.Text);

同样的问题也存在于卡通类型。如果您编写的代码是正确的,那么您的查询实际上是在搜索“textBoxTitel.Text”而不是trackid

我不知道这是打字错误还是真正的错误,应该更正

这一行来自您的代码

 sqlCmd.Parameters.AddWithValue("@TrackId", "Select Id from Track WHERE Titel = textBoxTitel.Text");
应该这样写

 sqlCmd.Parameters.AddWithValue("@TrackId", "Select Id from Track WHERE Titel = " + textBoxTitel.Text);
同样的问题也存在于卡通类型。如果您编写的代码是正确的,那么您的查询实际上是在搜索“textBoxTitel.Text”而不是trackid,您就接近了。不能按预期的方式注入SQL。您必须移动insert语句,以便查询根据您的参数对每个值进行选择

首先,让我们尝试了解执行的SQL查询是什么样子的:

String Track1Genre = "INSERT INTO TrackGenre (TrackId, GenreId) VALUES (@TrackId, @GenreId)";
sqlCmd.Parameters.AddWithValue("@TrackId", "Select Id from Track WHERE Titel = textBoxTitel.Text");
sqlCmd.Parameters.AddWithValue("@GenreId", "Select Id from Genre where Genre = Genre");
请记住,将使用在参数上设置的任何(字符串)值,而不进行任何计算。因此,上述语句将导致执行此sql:

插入到TrackGenre(TrackId,GenreId)
值('Select Id from Track WHERE Titel=textBoxTitel.Text',
“从流派中选择Id,其中流派=流派”);
所以它很好地防止了一个错误,但它也没有将Id返回到表Track和Gene,事实上,它会抱怨转换为数据类型int失败

相反,您可以按原样传递选择参数,然后在查询中使用这些参数来获取感兴趣的行的id

尽可能靠近您目前拥有的,这将起作用:

using (var connection = Database.connection)
{
    String Track1Genre = @"
      INSERT 
      INTO TrackGenre(TrackId, GenreId) 
      VALUES (
        (SELECT id FROM track WHERE titel = @titel), /* do a select for the ID */
        (SELECT id FROM genre WHERE genre = @genre))";

    string Genre = listBoxGenre.GetItemText(listBoxGenre.SelectedItem);
    using (SqlCommand sqlCmd = new SqlCommand(Track1Genre, connection))
    {

        // caution, better use Add, see the note
        sqlCmd.Parameters.AddWithValue("@titel", textBoxTitel.Text);
        sqlCmd.Parameters.AddWithValue("@Genre", Genre);
        sqlCmd.ExecuteNonQuery();
    }
}
请记住,如果有同名曲目或同名流派曲目,insert语句将失败。但这取决于你如何处理或防止上游发生的情况

如果您想100%确定从插入曲目中获得的Id,请参阅的答案中的输出Inserted.Id选项。您必须将
lastid
变量带到我在这里显示的代码中,用它替换第一个参数(并相应地调整插入查询)

注意
使用
AddWithValue
有一个潜在的问题,正如JCoohorn的这篇博文所解释的:

最好防止SqlParameter类猜测您的类型错误。考虑使用

sqlCmd.Parameters.Add("@titel", SqlDbType.NVarChar, 250).Value = textBoxTitel.Text;
相反

如果您想先尝试插入查询,以了解它在做什么,请使用fork。

很接近。不能按预期的方式注入SQL。您必须移动insert语句,以便查询根据您的参数对每个值进行选择

首先,让我们尝试了解执行的SQL查询是什么样子的:

String Track1Genre = "INSERT INTO TrackGenre (TrackId, GenreId) VALUES (@TrackId, @GenreId)";
sqlCmd.Parameters.AddWithValue("@TrackId", "Select Id from Track WHERE Titel = textBoxTitel.Text");
sqlCmd.Parameters.AddWithValue("@GenreId", "Select Id from Genre where Genre = Genre");
请记住,将使用在参数上设置的任何(字符串)值,而不进行任何计算。因此,上述语句将导致执行此sql:

插入到TrackGenre(TrackId,GenreId)
值('Select Id from Track WHERE Titel=textBoxTitel.Text',
“从流派中选择Id,其中流派=流派”);
所以它很好地防止了一个错误,但它也没有将Id返回到表Track和Gene,事实上,它会抱怨转换为数据类型int失败

相反,您可以按原样传递选择参数,然后在查询中使用这些参数来获取感兴趣的行的id

尽可能靠近您目前拥有的,这将起作用:

using (var connection = Database.connection)
{
    String Track1Genre = @"
      INSERT 
      INTO TrackGenre(TrackId, GenreId) 
      VALUES (
        (SELECT id FROM track WHERE titel = @titel), /* do a select for the ID */
        (SELECT id FROM genre WHERE genre = @genre))";

    string Genre = listBoxGenre.GetItemText(listBoxGenre.SelectedItem);
    using (SqlCommand sqlCmd = new SqlCommand(Track1Genre, connection))
    {

        // caution, better use Add, see the note
        sqlCmd.Parameters.AddWithValue("@titel", textBoxTitel.Text);
        sqlCmd.Parameters.AddWithValue("@Genre", Genre);
        sqlCmd.ExecuteNonQuery();
    }
}
请记住,如果有同名曲目或同名流派曲目,insert语句将失败。但这取决于你如何处理或防止上游发生的情况

如果您想100%确定从插入曲目中获得的Id,请参阅的答案中的输出Inserted.Id选项。您必须将
lastid
变量带到我在这里显示的代码中,用它替换第一个参数(并相应地调整插入查询)

注意
使用
AddWithValue
有一个潜在的问题,正如JCoohorn的这篇博文所解释的:

最好防止SqlParameter类猜测您的类型错误。考虑使用

sqlCmd.Parameters.Add("@titel", SqlDbType.NVarChar, 250).Value = textBoxTitel.Text;
相反

如果您想先试用insert查询以了解它在做什么,请使用fork。

两种方法:

插入的输出.Id

INSERT INTO Track (Titel) VALUES output INSERTED.ID (@Titel)
在C#中,使用:

标识\u插入到

SET IDENTITY_INSERT dbo.Track ON; 
INSERT INTO Track (Id, Titel) VALUES (1, @Titel)
SET IDENTITY_INSERT dbo.Track OFF; 
在这种方法中,您已经知道要插入的Id,因此您可以使用它来更新
trackgreen
表。但是,是的,您必须跟踪您的id,或者在执行最后一个id检查之前,可以使用两种方法执行此操作:

插入的输出.Id

INSERT INTO Track (Titel) VALUES output INSERTED.ID (@Titel)
在C#中,使用:

标识\u插入到

SET IDENTITY_INSERT dbo.Track ON; 
INSERT INTO Track (Id, Titel) VALUES (1, @Titel)
SET IDENTITY_INSERT dbo.Track OFF; 

在这种方法中,您已经知道要插入的Id,因此您可以使用它来更新
trackgreen
表。但是,是的,您必须跟踪您的id,或者在执行最后一个id检查之前,使用
select max(id)from track

使用内联查询不是一个好的做法。在执行插入命令之前,在单独的sql查询(和单独的sql命令)中进行选择,您会没事的。您不能插入一个查询并假设它将以某种方式执行并产生一个结果!这些值是prob