要求:
1.查询某一门课程的信息。要查询的课程由用户在程序运行过程中指定,放在主变量中
2.查询选修某一门课程的选课信息,要查询的课程号由用户在程序运行过程中指定,放在主变量中,然后根据用户的要求修改其中某些记录的成绩字段
准备工作:
首先在vs中选择c#
打开,然后在项目中的nuget库中,安装MySQL.DATA包
然后vs就可以运行mysql相应的函数。
实现1:
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 数据库2._1
{
internal class Program
{
static void Main(string[] args)
{
string connStr = "server=127.0.0.1;port=3306;user=root;password=yourpassword;database=s-t;";
using (MySqlConnection connection = new MySqlConnection(connStr))
{
try
{
Console.WriteLine("Connecting to MySQL...");
connection.Open();
// 用户输入课程名称
Console.Write("Enter the course name to query: ");
string courseName = Console.ReadLine();
// 构造SQL查询语句
string query = "SELECT * FROM course WHERE cname = @CourseName";
using (MySqlCommand command = new MySqlCommand(query, connection))
{
// 使用参数化查询来避免SQL注入
command.Parameters.AddWithValue("@CourseName", courseName);
using (MySqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
int cno = reader.GetInt32("cno");
string cname = reader.GetString("cname");
string cpno = reader.GetString("cpno");
int ccredit = reader.GetInt32("ccredit");
// 输出课程信息
Console.WriteLine("Cno: {0}, cName: {1}, Cpno: {2} , Ccredit: {3}", cno, cname, cpno,ccredit);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
Console.WriteLine("Done.");
}
}
}
(数据库链接的password自己修改为自己的password哦!)
运行结果:
小结1:
- 程序使用了MySql.Data.MySqlClient命名空间提供的类和方法来连接MySQL数据库,并执行查询操作。
- 用户可以输入要查询的课程名称。
- 程序通过使用参数化查询来避免SQL注入攻击。
- 使用MySqlCommand对象的ExecuteReader()方法执行查询,并通过MySqlDataReader对象读取查询结果。
- 程序通过读取MySqlDataReader对象的字段值,将查询结果输出到控制台。
难点分析1:
- 使用MySQL数据库连接:程序中使用了MySqlConnection类和相关方法来建立与MySQL数据库的连接,需要确保数据库服务器已启动并且提供了正确的连接字符串。
- 参数化查询:为了避免SQL注入攻击,程序使用了参数化查询。这涉及到使用MySqlCommand对象的Parameters属性和AddWithValue()方法来设置查询参数。
- 执行查询和读取结果:程序通过调用MySqlCommand对象的ExecuteReader()方法执行查询,并通过MySqlDataReader对象来逐行读取查询结果。需要注意使用正确的字段名来读取数据。
- 异常处理:程序中使用了异常处理机制来捕获可能发生的异常,并将异常信息输出到控制台。
实现2:
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace 数据库2._2
{
internal class Program
{
static string connectionString = "server=localhost;user=root;database=s-t;port=3306;password=yourpassword;"; // 替换为你的连接字符串
static void Main(string[] args)
{
string courseId = GetUserInput("请输入课程号:");
// 查询选课信息
DataTable courseSelections = QueryCourseSelections(courseId);
DisplayCourseSelections(courseSelections);
// 假设用户已经选择了要修改的学号和新的成绩
string studentId = GetUserInput("请输入要修改成绩的学号:");
string newGradeString = GetUserInput("请输入新的成绩:");
decimal newGrade = decimal.Parse(newGradeString);
// 更新成绩
if (UpdateGrade(courseId, studentId, newGrade))
{
Console.WriteLine("成绩更新成功!");
}
else
{
Console.WriteLine("未找到该学生的选课信息或更新失败。");
}
Console.ReadLine(); // 等待用户按键退出
}
static DataTable QueryCourseSelections(string courseId)
{
DataTable dt = new DataTable();
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
connection.Open();
string sql = "SELECT * FROM sc WHERE cno = @courseId";
using (MySqlCommand command = new MySqlCommand(sql, connection))
{
command.Parameters.AddWithValue("@courseId", courseId);
using (MySqlDataAdapter adapter = new MySqlDataAdapter(command))
{
adapter.Fill(dt);
}
}
}
return dt;
}
static void DisplayCourseSelections(DataTable dt)
{
foreach (DataRow row in dt.Rows)
{
Console.WriteLine($"sno: {row["sno"]}, cno:{row["cno"]},成绩: {row["grade"]}");
}
}
static bool UpdateGrade(string courseId, string studentId, decimal newGrade)
{
bool success = false;
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
connection.Open();
string sql = "UPDATE sc SET grade = @newGrade WHERE cno = @courseId AND sno = @studentId";
using (MySqlCommand command = new MySqlCommand(sql, connection))
{
command.Parameters.AddWithValue("@newGrade", newGrade);
command.Parameters.AddWithValue("@courseId", courseId);
command.Parameters.AddWithValue("@studentId", studentId);
int rowsAffected = command.ExecuteNonQuery();
success = rowsAffected > 0;
}
}
return success;
}
static string GetUserInput(string prompt)
{
Console.Write(prompt);
return Console.ReadLine();
}
}
}
运行结果:
这就是修改成功了。
小结2:
- 程序通过使用MySql.Data.MySqlClient命名空间提供的类和方法连接MySQL数据库,并执行查询和更新操作。
- 使用参数化查询可以有效防止SQL注入攻击,避免了潜在的安全风险。
- 通过使用DataTable和DataAdapter来处理查询结果,使得结果集能够方便地被读取和显示。
- 更新操作通过执行UPDATE语句来实现,根据所影响的行数判断是否更新成功。
难点分析2:
- 使用MySQL数据库连接:程序中使用了MySqlConnection类和相关方法来建立与MySQL数据库的连接,需要确保数据库服务器已启动并且提供了正确的连接字符串。
- 参数化查询:为了防止SQL注入攻击,程序使用了参数化查询。这涉及到使用MySqlCommand对象的Parameters属性和AddWithValue()方法来设置查询参数。
- 数据表和数据适配器:程序使用了DataTable对象和MySqlDataAdapter来处理查询结果。这些类可以方便地将结果集填充到DataTable中,并提供了对数据的操作和显示功能。
- 数据转换和异常处理:程序中有一些涉及数据转换的地方,比如将新成绩从字符串转换为decimal类型。此外,还需要处理可能发生的异常情况,如连接数据库失败或更新操作失败
实验总结:
1.这两个代码示例都是基于C#语言和MySQL数据库的操作,实现了对MySQL数据库的连接、查询和更新等基本操作。它们展示了如何使用C#中的MySql.Data.MySqlClient命名空间提供的类和方法来连接和操作MySQL数据库。
2.总体而言,这些示例程序提供了一个关于如何使用C#连接和操作MySQL数据库的基本流程和范例。通过学习这些示例程序,我们可以了解到如何使用C#编写与MySQL数据库交互的程序,包括建立连接、执行查询和更新操作、读取执行结果等。
3.此外,这些示例程序还展示了一些特别重要的操作,如参数化查询和异常处理。这些技术可以有效地防止SQL注入攻击,并保证程序在出现异常情况时能够正确地处理异常信息。
4.在实际的开发工作中,我们需要根据具体的需求和业务场景来使用这些技术和方法,以实现更加高效和安全的数据库操作。同时,我们还需要遵循相关的安全规范和最佳实践,确保数据库的数据安全和保密性。
建表请参考:
(https://blog.youkuaiyun.com/m0_74749240/article/details/139103909?spm=1001.2014.3001.5501 )