SQL 的 "Insert Into" 正在工作......但不是
SQL's "Insert Into" is Working..... but not
所以这是我一段时间以来不得不处理的最令人沮丧的编码问题之一。
我一直通过自动化制作小型数据库,我一直使用这种方法,而且我总是能够通过使用 "Show table data"
立即看到结果
所以我有 1000 个文件都包含几行数据,我的脚本遍历文件并将相关数据上传到数据库。
我的程序读取数据正常,将数据插入 table 正常(或说它确实如此),但 .mdf 不更新,程序退出后 - 总是有 0 行数据已保存。
我已经在两台不同的计算机上尝试了我的常规方法(我已经成功使用了十几次),但没有成功。
所以数据库一开始什么也没有。
代码如下:
Using check2 As New SqlClient.SqlCommand("Select Count (*) From Drops", con)
MsgBox(check2.ExecuteScalar)
//This returns 0
End Using
For Each newfile As String In Directory.GetFiles(fileLoc)
//A lot of uninteresting code
Using con As New System.Data.SqlClient.SqlConnection(connStr)
con.Open()
Using check As New SqlClient.SqlCommand("SELECT COUNT(*) FROM Drops WHERE Time='" & time & "' AND Lat='" & theLat & "' AND Long='" & theLong & "'", con)
If check.ExecuteScalar = 0 Then
Using Update As New SqlClient.SqlCommand("INSERT INTO Drops(Vendor, Model, AndVer, Time, SubType, Lat, Long, LAC, CellID) VALUES('" & Vendor & "','" & Model & "','" & AndroidVer & "','" & time & "','" & SubType & "'," & theLat & "," & theLong & "," & LAC & ",'" & cellID & "')", con)
Update.ExecuteNonQuery()
added += 1
End Using
End If
End Using
End Using
Next
Using check3 As New SqlClient.SqlCommand("Select Count (*) From Drops", con)
MsgBox(check3.ExecuteScalar)
//This returns over 1000
End Using
所以我知道 INSERT 命令有效,因为 check3 在脚本开头报告 0 时从 "Drops" 返回 1000 个条目。所以我的问题是 - 所有数据都去哪儿了???
mdf 文件似乎永远不会更新,每次我在脚本结束后返回它们时,它们总是包含 0 个条目 - 我已经检查了位于 bin 和主项目本身中的 mdf 文件。是否有我不小心按到的设置或开关?
更奇怪的是,我认为这可能是一个调试问题 - 所以我发布了项目,认为一旦它离开调试环境就会开始保存数据 - 但不是。无论写入多少文件,mdf 文件都不会超过 3mb(空白)。
任何帮助总是非常感谢,
谢谢,
-Z
我打赌你正在以这种方式使用连接字符串
Dim connStr As String = "Server=your_server;Database=|DataDirectory|\name_of_db;User Id=user_name;Password=my_password"
或者如果它位于您的 config.file
<connectionStrings>
<add name="ConnString"
connectionString="Data Source=(LocalDB)\v12.0;AttachDbFilename=|DataDirectory|\yourDatabase.mdf;Integrated Security=True" />
</connectionStrings>
如果是这样,请记住有时 Data Source=|DataDirectory|\...
在调试时会出现问题。请记住,在调试代码时,项目文件夹中的 \bin\debug
中会有另一个数据库。可能您正在更新此数据库中的记录而不是原始记录。
尝试设置绝对路径并检查记录是否正在更新。
ConnectionString = "Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\yourProjectFolder\YourDBName.mdf;Integrated Security=True"
有一个 属性 Copy to Output Directory
,默认值为 Copy if newer
(如果您使用 .mdf
或 .mdb
文件,默认值为Copy always
)。您可以查看此 MSDN document 以了解此 属性 的含义。简而言之,本地数据库文件将被复制到输出目录,该数据库将被更新。
如果您不想Visual Studio为您复制数据库文件,您可以将复制设置为Output Directory
属性到Do not copy
。然后由您选择何时以及如何覆盖数据库文件。当然,您仍然需要数据库文件的两份副本:在设计时,您正在使用解决方案目录中的数据库文件,而在 运行 时,您正在修改输出目录中的数据库文件。
所以这是我一段时间以来不得不处理的最令人沮丧的编码问题之一。
我一直通过自动化制作小型数据库,我一直使用这种方法,而且我总是能够通过使用 "Show table data"
立即看到结果所以我有 1000 个文件都包含几行数据,我的脚本遍历文件并将相关数据上传到数据库。
我的程序读取数据正常,将数据插入 table 正常(或说它确实如此),但 .mdf 不更新,程序退出后 - 总是有 0 行数据已保存。
我已经在两台不同的计算机上尝试了我的常规方法(我已经成功使用了十几次),但没有成功。
所以数据库一开始什么也没有。
代码如下:
Using check2 As New SqlClient.SqlCommand("Select Count (*) From Drops", con)
MsgBox(check2.ExecuteScalar)
//This returns 0
End Using
For Each newfile As String In Directory.GetFiles(fileLoc)
//A lot of uninteresting code
Using con As New System.Data.SqlClient.SqlConnection(connStr)
con.Open()
Using check As New SqlClient.SqlCommand("SELECT COUNT(*) FROM Drops WHERE Time='" & time & "' AND Lat='" & theLat & "' AND Long='" & theLong & "'", con)
If check.ExecuteScalar = 0 Then
Using Update As New SqlClient.SqlCommand("INSERT INTO Drops(Vendor, Model, AndVer, Time, SubType, Lat, Long, LAC, CellID) VALUES('" & Vendor & "','" & Model & "','" & AndroidVer & "','" & time & "','" & SubType & "'," & theLat & "," & theLong & "," & LAC & ",'" & cellID & "')", con)
Update.ExecuteNonQuery()
added += 1
End Using
End If
End Using
End Using
Next
Using check3 As New SqlClient.SqlCommand("Select Count (*) From Drops", con)
MsgBox(check3.ExecuteScalar)
//This returns over 1000
End Using
所以我知道 INSERT 命令有效,因为 check3 在脚本开头报告 0 时从 "Drops" 返回 1000 个条目。所以我的问题是 - 所有数据都去哪儿了???
mdf 文件似乎永远不会更新,每次我在脚本结束后返回它们时,它们总是包含 0 个条目 - 我已经检查了位于 bin 和主项目本身中的 mdf 文件。是否有我不小心按到的设置或开关?
更奇怪的是,我认为这可能是一个调试问题 - 所以我发布了项目,认为一旦它离开调试环境就会开始保存数据 - 但不是。无论写入多少文件,mdf 文件都不会超过 3mb(空白)。
任何帮助总是非常感谢, 谢谢, -Z
我打赌你正在以这种方式使用连接字符串
Dim connStr As String = "Server=your_server;Database=|DataDirectory|\name_of_db;User Id=user_name;Password=my_password"
或者如果它位于您的 config.file
<connectionStrings>
<add name="ConnString"
connectionString="Data Source=(LocalDB)\v12.0;AttachDbFilename=|DataDirectory|\yourDatabase.mdf;Integrated Security=True" />
</connectionStrings>
如果是这样,请记住有时 Data Source=|DataDirectory|\...
在调试时会出现问题。请记住,在调试代码时,项目文件夹中的 \bin\debug
中会有另一个数据库。可能您正在更新此数据库中的记录而不是原始记录。
尝试设置绝对路径并检查记录是否正在更新。
ConnectionString = "Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\yourProjectFolder\YourDBName.mdf;Integrated Security=True"
有一个 属性 Copy to Output Directory
,默认值为 Copy if newer
(如果您使用 .mdf
或 .mdb
文件,默认值为Copy always
)。您可以查看此 MSDN document 以了解此 属性 的含义。简而言之,本地数据库文件将被复制到输出目录,该数据库将被更新。
如果您不想Visual Studio为您复制数据库文件,您可以将复制设置为Output Directory
属性到Do not copy
。然后由您选择何时以及如何覆盖数据库文件。当然,您仍然需要数据库文件的两份副本:在设计时,您正在使用解决方案目录中的数据库文件,而在 运行 时,您正在修改输出目录中的数据库文件。