[英]C# adding data to a SQL table “Specified cast is not valid.”
C# 用ASP.NET向SQL表添加数据报错
System.InvalidCastException:“指定的转换无效”
这是针对数据类型为 bigint 的外键列。
我在 C# 中将我的类型设置为 Int64,在 int 定义抛出错误但仍然得到错误之后。
这是因为我无法添加到具有外键的列吗? 我需要级联吗?
这是我的数据控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using SchoolDb.Models;
using MySql.Data.MySqlClient;
using System.Diagnostics;
namespace SchoolDb.Controllers
{
public class CoursesDataController : ApiController
{
private SchoolDbContext School = new SchoolDbContext();
/// <summary>
/// returns list of courses in the system
/// </summary>
/// <example>GET api/CoursesData/ListCourses</example>
/// <returns>a list of courses</returns>
[HttpGet]
[Route("api/CourseData/ListCourses/{SearchKey?}")]
public IEnumerable<Course> ListCourses(string SearchKey = null)
{
//create an instance of a connection
MySqlConnection Conn = School.AccessDatabase();
//open the connection between server and database
Conn.Open();
string query = "Select * from classes where lower(classname) like lower(@key) or classid like (@key)";
Debug.WriteLine("the search key is " + query);
// establish a new command query for our database
MySqlCommand cmd = Conn.CreateCommand();
// SQL query
cmd.CommandText = query;
cmd.Parameters.AddWithValue("@key", "%" + SearchKey + "%");
cmd.Prepare();
// gather result set of query into variable
MySqlDataReader ResultSet = cmd.ExecuteReader();
// create an empty list of courses
List<Course> Courses = new List<Course> { };
while (ResultSet.Read())
{
// access column information by the db column name as an index
int ClassId = (int)ResultSet["classid"];
string ClassCode = (string)ResultSet["classcode"];
Int64 TeacherId = (Int64)ResultSet["teacherid"];
DateTime StartDate = (DateTime)ResultSet["startdate"];
DateTime FinishDate = (DateTime)ResultSet["finishdate"];
string ClassName = (string)ResultSet["classname"];
Course NewCourse = new Course();
NewCourse.ClassId = ClassId;
NewCourse.ClassCode = ClassCode;
NewCourse.TeacherId = TeacherId;
NewCourse.StartDate = StartDate;
NewCourse.FinishDate = FinishDate;
NewCourse.ClassName = ClassName;
// add the course info to the list
Courses.Add(NewCourse);
}
Conn.Close();
// return the final list of courses
return Courses;
}
/// <summary>
/// returns a single instance of a course
/// </summary>
/// <param name="id">class id</param>
/// <returns>info on a particular course based on classid input</returns>
[HttpGet]
public Course FindCourse(int id)
{
Course NewCourse = new Course();
// create an instance of a connection
MySqlConnection Conn = School.AccessDatabase();
// open the connection between server and database
Conn.Open();
// establish a new command query for our database
MySqlCommand cmd = Conn.CreateCommand();
// SQL query
cmd.CommandText = "Select * from classes where classid = " + id;
// gather result set of query into variable
MySqlDataReader ResultSet = cmd.ExecuteReader();
while (ResultSet.Read())
{
// access column information by the db column name as an index
int ClassId = (int)ResultSet["classid"];
string ClassCode = (string)ResultSet["classcode"];
Int64 TeacherId = (Int64)ResultSet["teacherid"];
DateTime StartDate = (DateTime)ResultSet["startdate"];
DateTime FinishDate = (DateTime)ResultSet["finishdate"];
string ClassName = (string)ResultSet["classname"];
NewCourse.ClassId = ClassId;
NewCourse.ClassCode = ClassCode;
NewCourse.TeacherId = TeacherId;
NewCourse.StartDate = StartDate;
NewCourse.FinishDate = FinishDate;
NewCourse.ClassName = ClassName;
}
return NewCourse;
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <example>POST: /api/CoursesData/DeleteCourse/3</example>
[HttpPost]
public void DeleteCourse(int id)
{
// create an instance of a connection
MySqlConnection Conn = School.AccessDatabase();
// open the connection between server and database
Conn.Open();
// establish a new command query for our database
MySqlCommand cmd = Conn.CreateCommand();
// SQL query
cmd.CommandText = "Delete from classes where classid=@id";
cmd.Parameters.AddWithValue("@id", id);
cmd.Prepare();
cmd.ExecuteNonQuery();
Conn.Close();
}
[HttpPost]
public void AddCourse(Course NewCourse)
{
// create an instance of a connection
MySqlConnection Conn = School.AccessDatabase();
// open the connection between server and database
Conn.Open();
// establish a new command query for our database
MySqlCommand cmd = Conn.CreateCommand();
// SQL query
cmd.CommandText = "insert into classes (classcode, teacherid, startdate, finishdate, classname) value (@ClassCode, @TeacherId, @StartDate,@FinishDate,@ClassName)";
cmd.Parameters.AddWithValue("@ClassCode", NewCourse.ClassCode);
cmd.Parameters.AddWithValue("@TeacherId", NewCourse.TeacherId);
cmd.Parameters.AddWithValue("@StartDate", NewCourse.StartDate);
cmd.Parameters.AddWithValue("@FinishDate",NewCourse.FinishDate );
cmd.Parameters.AddWithValue("@ClassName", NewCourse.ClassName);
cmd.Prepare();
cmd.ExecuteNonQuery();
Conn.Close();
}
}
}
您没有指定InvalidCastException
发生在哪一行,所以我假设它是以下带有显式强制转换的行之一:
//access column information by the db column name as an index
int ClassId = (int)ResultSet["classid"];
string ClassCode = (string)ResultSet["classcode"];
Int64 TeacherId = (Int64)ResultSet["teacherid"];
DateTime StartDate = (DateTime)ResultSet["startdate"];
DateTime FinishDate = (DateTime)ResultSet["finishdate"];
string ClassName = (string)ResultSet["classname"];
一种可能性是尝试从long
列中检索int
,反之亦然。 这可以通过使用GetInt32
或GetInt64
方法来避免。 如果可能,这些会将值转换为较小的大小,否则抛出OverflowException
。
另一种可能性是某些列包含NULL
。 在这种情况下, ResultSet["Name"]
将返回DBNull.Value
,它不能转换为字符串(或 int 或 DateTime)。
根据哪些列可以包含NULL
值,您可能需要类似于以下的代码:
//access column information by the db column name as an index
int ClassId = ResultSet.GetInt32("classid");
string ClassCode = ResultSet.IsDBNull("classcode") ? null : reader.GetString("classcode");
Int64 TeacherId = ResultSet.GetInt64("teacherid");
DateTime StartDate = (DateTime)ResultSet["startdate"];
DateTime FinishDate = (DateTime)ResultSet["finishdate"];
string ClassName = ResultSet.IsDBNull("classname") ? null : ResultSet.GetString("classname");
但我建议使用像Dapper这样的 ORM 来简化所有这些代码,并将 map 数据库行轻松转换为 C# object。
你好:当不支持将一种类型的实例转换为另一种类型时(这就是它的定义),基本上会抛出InvalidCastException 。 例如,尝试将 Char 值转换为 DateTime 值会引发 InvalidCastException 异常。 在你的情况下,我认为首先你需要将“startdate”转换为 DateTime,你需要用 Try{}Catch(InvalidCastException ex){} 包围整个代码。 然后对于实际问题,如果您对返回类型有疑问,我认为您需要使用 var 而不是 DateTime 或 Int64。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.