我是SQL的初学者,感谢您的关注。我已经在Visual Studio 2015中创建了一个数据库(使用“Project”菜单中的“Add new Item”并添加“Service Based Database”),现在我想连接它并在其上读取或写入数据。
但我不知道如何通过代码连接到它。
当我点击服务器资源管理器中的数据库时,我使用连接字符串中显示的字符串。
就在这里:
Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename="c:\users\soroush\documents\visual studio 2015\Projects\databasetest2\databasetest2\Database1.mdf";Integrated Security=True
但是如您所知,当我将其复制并粘贴到可以在new sqlConnection(connection string)
中使用的字符串时,它无法使用,因为此字符串具有'\'或'“'
连接到本地数据库的正确字符串是什么?
现在这是我的代码,但没用:
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = c:\users\soroush\documents\visual studio 2015\Projects\databasetest2\databasetest2\Database1.mdf; Integrated Security = True");
con.Open();
string t=@"INSERT INTO Table (Id,name) Values (34, 'John')";
SqlCommand cmd = new SqlCommand(t, con);
cmd.ExecuteNonQuery();
con.Close();
}
private void button2_Click(object sender, EventArgs e)
{
using (SqlConnection con = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = c:\users\soroush\documents\visual studio 2015\Projects\databasetest2\databasetest2\Database1.mdf; Integrated Security = True"))
{
con.Open();
string t = "SELECT * From Table";
SqlCommand cmd = new SqlCommand(t, con);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
MessageBox.Show(reader["Id"].ToString() + reader["name"].ToString());
}
con.Close();
}
}
感谢您的帮助
更新:我在撰写和阅读表时遇到了其他错误
我认为在使用您的帮助后我已连接到我的数据库。现在我在阅读表格时遇到了另一个错误。此错误指向
SqlDataReader reader = cmd.ExecuteReader();
在我的代码中说:
System.Data.dll中发生未处理的“System.Data.SqlClient.SqlException”类型的异常附加信息:关键字“Table”附近的语法不正确。
并且写入表中的错误指向
cmd.ExecuteNonQuery();
在我的代码中:
System.Data.dll中发生未处理的“System.Data.SqlClient.SqlException”类型的异常附加信息:关键字“Table”附近的语法不正确。
我的数据库有一个名为Table
的表,其中包含两列:Id(int)
和name(nchar10)
答案 0 :(得分:2)
你用来连接你的Sql db的代码是......好吧......真是老派。我们不再这样做了。
那么 - 我们可以做些什么呢?让我们使用nice library called Dapper来进行“说话”。到一个sql server 非常简单,更简单,更安全。
创建一个POCO,它将代表从DB返回的数据。
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
现在更新表单代码如下:
private const string _connectionString = @"Data Source = (LocalDB) <snipped..>";
private void button1_Click(object sender, EventArgs e)
{
string query = "INSERT INTO Table (Id,name) Values (34, 'John')";
int rowsInserted;
using (var db = new SqlConnection(_connectionString))
{
rowsInserted = db.Execute(query);
}
if (rowsInserted != 1)
{
// Log/Handle the fact that you failed to insert 1 record;
}
}
private void button2_Click(object sender, EventArgs e)
{
IList<Foo> foos;
using (var db = new SqlConnection(_connectionString))
{
const string query = "SELECT * FROM Table";
// This will always return a list. It's empty or has items in it.
foos = db.Query<Foo>(query).ToList();
}
foreach(var foo in foos)
{
MessageBox.Show($"{foo.Id} - {foo.Name}");
}
}
那更干净吗?是的 - 我是这么认为的。
当然,我绝不会把数据库代码放在winform事件之后,而是放入专门的课程等等。但我想你只是在学习/玩耍/试验:) :)
另外,我还没有把错误处理放在那里,以保持示例的小。
答案 1 :(得分:1)
变化:
string t = "SELECT * From Table";
为:
string t = "SELECT * From [Table]";
和
string t=@"INSERT INTO Table (Id,name) Values (34, 'John')";
为:
string t=@"INSERT INTO [Table] (Id,name) Values (34, 'John')";
请参阅https://stackoverflow.com/a/695590/34092和https://docs.microsoft.com/en-us/sql/t-sql/language-elements/reserved-keywords-transact-sql。
答案 2 :(得分:0)
我的问题已经解决了 首先连接到数据库我输入@ before连接字符串并删除字符串中的引号@juergen d在评论中说
第二个用于解决写入和读取表格中的错误我在&#34;表格&#34;之前和之后键入[和]正如@mjwills所说
@ Pure.Krome还解释了一种更专业的方法来改进代码
谢谢你们每个人