C# 数据库数据插入是一个常见的操作,在应用程序开发中经常需要将数据保存到数据库中,以下是关于 C# 数据库数据插入的详细内容:
1、基本语法
INSERT INTO table_name (column1, column2, column3, …) VALUES (value1, value2, value3, …);
INSERT INTO Students (Name, Age, Gender) VALUES (‘Tom’, 18, ‘Male’);
2、示例代码
以下是一个使用 C# 和 SQL 语句向数据库中插入数据的简单示例:
“`csharp
string connectionString = "Data Source=server;Initial Catalog=database;User Id=user;Password=password";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
string sql = "INSERT INTO Students (Name, Age, Gender) VALUES (@Name, @Age, @Gender)";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@Name", "Tom");
cmd.Parameters.AddWithValue("@Age", 18);
cmd.Parameters.AddWithValue("@Gender", "Male");
int rowsAffected = cmd.ExecuteNonQuery();
conn.Close();
二、使用 SqlParameter 类插入数据 1、优点 可以防止 SQL 注入攻击,提高数据安全性。 便于对参数进行管理和操作。 2、示例代码 ```csharp string connectionString = "Data Source=server;Initial Catalog=database;User Id=user;Password=password"; SqlConnection conn = new SqlConnection(connectionString); conn.Open(); string sql = "INSERT INTO Students (Name, Age, Gender) VALUES (@Name, @Age, @Gender)"; SqlCommand cmd = new SqlCommand(sql, conn); SqlParameter nameParam = new SqlParameter("@Name", "Tom"); SqlParameter ageParam = new SqlParameter("@Age", 18); SqlParameter genderParam = new SqlParameter("@Gender", "Male"); cmd.Parameters.Add(nameParam); cmd.Parameters.Add(ageParam); cmd.Parameters.Add(genderParam); int rowsAffected = cmd.ExecuteNonQuery(); conn.Close();
1、使用 SqlBulkCopy 类
适用于大量数据的快速插入,可以提高插入效率。
示例代码:
“`csharp
string connectionString = "Data Source=server;Initial Catalog=database;User Id=user;Password=password";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
DataTable dt = new DataTable("Students");
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Age", typeof(int));
dt.Columns.Add("Gender", typeof(string));
for (int i = 0; i < 1000; i++)
{
DataRow dr = dt.NewRow();
dr["Name"] = "Student" + i;
dr["Age"] = 20 + i % 10;
dr["Gender"] = i % 2 == 0 ? "Male" : "Female";
dt.Rows.Add(dr);
}
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);
bulkCopy.DestinationTableName = "Students";
bulkCopy.WriteToServer(dt);
conn.Close();
2、使用存储过程 可以先创建一个存储过程,然后在 C# 中调用该存储过程来批量插入数据。 示例代码: ```csharp // 创建存储过程的 SQL 语句 string createProcSql = @"CREATE PROCEDURE usp_InsertStudents @Students [dbo].[Student] READONLY AS BEGIN SET NOCOUNT ON; INSERT INTO Students (Name, Age, Gender) SELECT Name, Age, Gender FROM @Students; END"; // 执行存储过程的 C# 代码 string connectionString = "Data Source=server;Initial Catalog=database;User Id=user;Password=password"; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); SqlCommand createProcCmd = new SqlCommand(createProcSql, conn); createProcCmd.ExecuteNonQuery(); DataTable dt = new DataTable("Students"); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); dt.Columns.Add("Gender", typeof(string)); for (int i = 0; i < 1000; i++) { DataRow dr = dt.NewRow(); dr["Name"] = "Student" + i; dr["Age"] = 20 + i % 10; dr["Gender"] = i % 2 == 0 ? "Male" : "Female"; dt.Rows.Add(dr); } SqlCommand procCmd = new SqlCommand("usp_InsertStudents", conn); procCmd.CommandType = CommandType.StoredProcedure; SqlParameter studentsParam = procCmd.Parameters.AddWithValue("@Students", dt); studentsParam.SqlDbType = SqlDbType.Structured; int rowsAffected = procCmd.ExecuteNonQuery(); }
1、准备工作
在数据库中添加一个表,表中添加字段,例如Image
字段的类型为image
(不同的数据库可能有不同的类型,如varbinary(max)
)。
示例代码:
“`sql
CREATE TABLE Images (
Id INT PRIMARY KEY IDENTITY,
ImageData VARBINARY(MAX)
);
2、**C# 代码实现** ```csharp string connectionString = "Data Source=server;Initial Catalog=database;User Id=user;Password=password"; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); byte[] imageBytes = File.ReadAllBytes("path/to/image.jpg"); // 读取图片文件的字节数组 string sql = "INSERT INTO Images (ImageData) VALUES (@ImageData)"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@ImageData", imageBytes); int rowsAffected = cmd.ExecuteNonQuery(); }
1、连接字符串的安全性
不要在代码中硬编码连接字符串,可以使用配置文件或环境变量来存储连接字符串,并确保其安全性。
可以在Web.config
文件中配置连接字符串,然后通过ConfigurationManager.ConnectionStrings
获取。
“`xml
<configuration>
<connectionStrings>
<add name="ConnStr" connectionString="Data Source=server;Initial Catalog=database;User Id=user;Password=password" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
在 C# 代码中获取连接字符串: ```csharp string connectionString = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
2、异常处理
在进行数据库操作时,应该使用try-catch
块来捕获和处理可能出现的异常,以提高程序的稳定性和可靠性。
“`csharp
try
{
// 数据库操作代码
}
catch (Exception ex)
{
// 记录异常日志或提示用户错误信息
Console.WriteLine("数据库操作出错:" + ex.Message);
}
六、FAQs 1、问题:如何在 C# 中连接不同类型的数据库?解答:C# 可以通过不同的数据提供程序来连接不同类型的数据库,对于 SQL Server 数据库,可以使用System.Data.SqlClient
;对于 MySQL 数据库,可以使用MySql.Data.MySqlClient
;对于 Oracle 数据库,可以使用System.Data.OracleClient
等,在连接字符串中指定相应的数据库服务器地址、数据库名称、用户名和密码等信息即可建立连接。 连接 MySQL 数据库的代码如下: ```csharp string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"; MySqlConnection conn = new MySqlConnection(connectionString); conn.Open(); // 进行数据库操作 conn.Close();
2、问题:如何防止 SQL 注入攻击?
解答:使用参数化查询是防止 SQL 注入攻击的有效方法,不要直接将用户输入的内容拼接到 SQL 语句中,而是使用参数占位符,并通过SqlParameter
类或其他方式为参数赋值,这样可以避免反面用户通过输入特殊的 SQL 语句来破坏数据库的完整性和安全性。