标签: sqlclient

使用SqlCommand.Parameters的C#更新表

我正在尝试使用SqlCommand更新MSSQL表,我认为这是我的T-SQL的语法错误,但是到目前为止,这是我所拥有的:

SqlCommand sqlCmd = new SqlCommand("UPDATE yak_tickets SET email = @emailParam, subject = @subjectParam, text = @textParam, statusid = @statusIDParam, ticketClass = @ticketClassParam WHERE id = @ticketIDParam", sqlConn);
Run Code Online (Sandbox Code Playgroud)

参数正在按应有的方式工作,但是,当我运行代码时,表永远不会更新。任何帮助将不胜感激=)

这是其余的代码:

    #region Parameters
    /* Parameters */
    sqlCmd.Parameters.Add("@ticketIDParam", SqlDbType.BigInt);
    sqlCmd.Parameters["@ticketIDParam"].Value = ticketID;

    sqlCmd.Parameters.Add("@emailParam", SqlDbType.NVarChar);
    sqlCmd.Parameters["@emailParam"].Value = ticketToBeSubmitted.getEmail();

    sqlCmd.Parameters.Add("@subjectParam", SqlDbType.NVarChar);
    sqlCmd.Parameters["@subjectParam"].Value = ticketToBeSubmitted.getSubject();

    sqlCmd.Parameters.Add("@textParam", SqlDbType.Text);
    sqlCmd.Parameters["@textParam"].Value = ticketToBeSubmitted.getTicketContent();

    sqlCmd.Parameters.Add("@statusIDParam", SqlDbType.NVarChar);
    sqlCmd.Parameters["@statusIDParam"].Value = ticketToBeSubmitted.getStatus();

    sqlCmd.Parameters.Add("@ticketClassParam", SqlDbType.NVarChar);
    sqlCmd.Parameters["@ticketClassParam"].Value = ticketToBeSubmitted.getTicketClass();
    #endregion

    #region Try/Catch/Finally
    /* Try/Catch/Finally */

    try
    {
        sqlConn.Open();
        sqlCmd.ExecuteNonQuery();
    }
    catch (SqlException sqlEx)
    { …
Run Code Online (Sandbox Code Playgroud)

c# sql sqlcommand sqlclient

5
推荐指数
1
解决办法
3万
查看次数

System.InvalidCastException:无法将参数值从XElement转换为String

注意:我无法在搜索中找到这个确切的问题.我在Stack Overflow上找到了一个类似的问题,这让我得到了解决方案.我发布了问题和解决方案,以便下一个有问题的人可以更轻松地找到解决方案.如果仍然可以,我会提出社区维基的问题 - 我不是在寻找代表.


我试图使用ADO.NET来调用SQL Server 2005存储过程,该过程接受Xml类型的参数:

CREATE PROCEDURE dbo.SomeProcedure(
    @ListOfIds Xml)
AS
BEGIN
    DECLARE
            @Ids TABLE(ID Int);
    INSERT INTO @Ids
    SELECT ParamValues.ID.value('.', 'Int')
    FROM @ListOfIds.nodes('/Persons/id') AS ParamValues(ID);

    SELECT p.Id,
           p.FirstName,
           p.LastName
    FROM Persons AS p
         INNER JOIN @Ids AS i ON p.Id = i.ID;
END;
Run Code Online (Sandbox Code Playgroud)

我将XML作为LINQ传递给XML XElement对象

var idList = new XElement(
    "Persons",
    from i in selectedPeople
    select new XElement("id", i));
Run Code Online (Sandbox Code Playgroud)

后来

SqlCommand cmd = new SqlCommand
                 {
                     Connection = conn,
                     CommandText = "dbo.SomeProcedure",
                     CommandType = …
Run Code Online (Sandbox Code Playgroud)

c# sql-server ado.net sql-server-2005 sqlclient

5
推荐指数
1
解决办法
7184
查看次数

是什么导致SqlClient重用无效连接?

我们在IIS中托管了WCF服务,在服务器上运行.该服务连接到另一台服务器上运行的SQL Server实例.在我们的代码中,我们打开并关闭每个请求的连接.WCF服务每分钟向数据库发出几个请求.

如果我在不停止WCF服务的情况下重新启动SQL服务,则WCF服务会开始将错误记录到错误日志中,这是完全正常的.

问题是,有时(并非总是),在SQL服务重新启动后,WCF服务会继续在每个请求上报告此错误:

Cannot open database "mydatabase" requested by the login. The login failed." 
Run Code Online (Sandbox Code Playgroud)

错误的堆栈跟踪结束于:

at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
Run Code Online (Sandbox Code Playgroud)

在发生这种情况时,我可以使用SQL Management Studio(来自运行WCF服务的同一台机器)连接到数据库.要解决此问题,我必须为我的WCF服务回收应用程序池.

所以我的问题是:什么可以导致这个,我该怎么做才能确保我的应用程序可以从SQL重启中恢复?

PS:在我的开发盒(也运行IIS)上,当我进行相同的测试时,我得到相同的错误几次(当数据库开始加载时我猜)然后它再次开始工作.

sql-server ado.net sqlclient

5
推荐指数
1
解决办法
163
查看次数

大小/类型的SqlParameters数组

我正在尝试创建一个dbTyped和大小的SqlParameters数组.这工作正常,但如果我需要另一列,则会导致两个地方都更改代码.

SqlParameter[] parameters = {
                                  new SqlParameter("@first_name", SqlDbType.VarChar, 50),
                                  new SqlParameter("@last_name", SqlDbType.VarChar, 50),
                                  new SqlParameter("@middle_name", SqlDbType.VarChar, 50),
                                  new SqlParameter("@empid", SqlDbType.Int)
                            };
parameters[0].Value = to.FirstName;
parameters[1].Value = to.LastName;
parameters[2].Value = to.MiddleName;
parameters[3].Value = to.EmpId;
Run Code Online (Sandbox Code Playgroud)

这样做的更好方法是什么?

.net c# sqlclient

5
推荐指数
1
解决办法
2万
查看次数

数据库连接失败(System.Data.Sqlclient.SqlException)

我正在编写一个气象站,它从 API 获取数据。这工作正常,但我想将其存储在数据库中以用它绘制图表。但我的代码似乎不起作用。我尝试调试它,但它在我想要打开数据库的行上失败。它贯穿我创建数据库的行。

这些是失败的线路:

databaseCon = new SqlConnection(@"Data Source=
(LocalDB)\v10.0;AttachDbFilename=C:\Users\Jeroen
Laptop\Desktop\Eindopdrachten\WeatherStation\Eindopdracht\
Weather.mdf;Integrated Security=True;");
databaseCon.Open();
        
Run Code Online (Sandbox Code Playgroud)

控制台中的错误消息:

System.Data.dll 中发生“System.Data.SqlClient.SqlException”类型的第一次机会异常

会发生什么:

我想从 API 获取数据并将其放入数据库中以制作包含温度、位置和日期的图表。为此,我创建了一个数据库,并且我想与其连接。这就是错误发生的地方。我从上面得到了错误。当我调试时,该消息会显示几次(100 次左右)并继续运行,而不填充数据库。

我希望这里有人能给我更多信息或者能看到我做错了什么。

更新:

当我尝试访问数据库时收到以下消息

System.Data.dll 中发生“System.Data.SqlClient.SqlException”类型的未处理异常

其他信息:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供商:SQL 网络接口,错误:52 - 无法找到本地数据库运行时安装。验证 SQL Server Express 是否已正确安装以及本地数据库运行时功能是否已启用。)

我将 Visual Studio 2010 与 SQL Server 2008 一起使用。我的编程笔记本电脑不支持 2012。

c# sql-server ado.net system.data.sqlite sqlclient

5
推荐指数
1
解决办法
9643
查看次数

SqlDataReader HasRows = True但没有数据

我正在连接到SQL Server 2012数据库,以基于ID查询单个值。(可能值得一提的是,该数据库位于我的开发机器上的另一大陆的服务器上,因此延迟非常高。大约100毫秒左右)。

该查询似乎已成功执行。该对象的HasRows属性SqlDataReader设置为true,因此我尝试使用该值来分配变量。当我正常运行程序时,遇到message异常'Given key was not present in the dictionary'。如果我停止执行并检查SqlDataReader对象,并枚举结果。首先,我被告知'enumeration yielded no results',然后当我继续执行时,消息中出现另一个异常'invalid attempt to read when no data is present'

这是有问题的代码:

SqlConnection sql_conn = new SqlConnection(ConnectionString);
SqlCommand sql_cmd = new SqlCommand(String.Format("select ItemType from ItemTable where ItemID='{0}'", item_id), sql_conn);

Console.WriteLine(sql_cmd.CommandText);

sql_conn.Open();

SqlDataReader rdr = sql_cmd.ExecuteReader();

rdr.Read();

if (rdr.HasRows) //True
{
    item_type= TypesMap[rdr["ItemType"].ToString()]; //Either 'given key not found in dictionary' or 'invalid attempt to read when no data is …
Run Code Online (Sandbox Code Playgroud)

c# sql-server sqlclient

5
推荐指数
1
解决办法
7022
查看次数

如何使SqlDataReader.ReadAsync()异步运行?

实际执行需要时间的SQL Server调用时,SqlDataReader.ReadAsync()对我来说是同步运行的。有什么方法可以强制它异步运行,还是我调用它的唯一选择Task.Run()

这是一个复制品。它使用winforms演示该调用阻塞了GUI线程。请注意,T-SQL必须实际执行某项操作-使用不能重现WAITFOR DELAY '00:00:20'

using System;
using System.Configuration;
using System.Data.Common;
using System.Data.SqlClient;
using System.Threading.Tasks;
using System.Windows.Forms;

static class SqlDataReaderReadAsyncProgram
{
    static async void Form_Shown(object sender, EventArgs e)
    {
        var form = (Form)sender;
        // Declare your connection string in app.config like
        // <connectionStrings><remove name="LocalSqlServer"/><add name="LocalSqlServer" connectionString="Data Source=localhost\SQLEXPRESS;Integrated Security=true"/></connectionStrings>
        using (DbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[0].ConnectionString))
        {
            form.Text = "connecting…";
            await connection.OpenAsync();
            form.Text = "connected!";
            // Install a stored procedure.
            using (var command = connection.CreateCommand()) …
Run Code Online (Sandbox Code Playgroud)

c# ado.net sqlclient task-parallel-library

5
推荐指数
1
解决办法
1357
查看次数

如何编写与数据库无关的 .NET Core 应用程序?

我正在努力将控制台应用程序从 .NET Framework 4.6.2 移植到 .NET Core 2.0。该应用程序需要连接到一个数据库,该数据库的平台在编译时未知。在完整的框架中,这可以通过使用DbProviderFactories.NET Core 2.0 中不再存在的机制轻松实现。

首先,我想我可以简单地DbProviderFactory自己动态加载相应的内容,使用类似于以下的代码:

public static DbProviderFactory GetFactory(string providerInvariantName)
{
    Type type = Type.GetType(dbProvider.Type);
    if (null != type)
    {
        FieldInfo field = type.GetField("Instance", BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Public);
        if (null != field && field.FieldType.IsSubclassOf(typeof(DbProviderFactory)))
        {
            object value = field.GetValue(null);
            if (value != null)
            {
                return (DbProviderFactory)value;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如在这个图书馆中所做的那样。只要DbProviderFactory在编译时引用包含 的程序集,此代码就可以正常工作(这违背了动态加载的目的)。

我试图直接放入System.Data.SqlClient.dll应用程序的文件夹中,但是该Instance字段是null因为这似乎只是不同runtimes程序集的存根实现。当静态引用时,编译器会生成一个.deps.json指向这些文件的详细文件。这里只是为了给人留下印象而做的一个小改动:

... …
Run Code Online (Sandbox Code Playgroud)

c# ado.net sqlclient database-agnostic .net-core

5
推荐指数
0
解决办法
726
查看次数

移动到 Microsoft.Data.SqlClient 后没有 SQL 依赖遥测

我正在开发多个 ASP.NET Web 服务,这些服务使用 SQL Server 进行存储并使用 Azure Application Insights 进行遥测。在 IISExpress 下本地运行服务时,我没有在依赖遥测中获得完整的 SQL 命令文本(尽管在调用 SP 时我确实看到了存储过程名称),所以我遵循了文档中针对这种情况的建议,并从System.Data.SqlClient 到新的 Microsoft.Data.SqlClient 包。

现在我没有看到来自使用 Microsoft.Data.SqlClient 的任何组件的任何 SQL 依赖遥测。这不是我希望的结果。

在更改之前,依赖遥测中的 sdkVersion 是“rddf:2.11.2-28447”。文档说我应该在这里看到一个“rddp:”前缀,但由于不再有任何SQL 遥测,我没有任何东西要检查。

一项服务使用 Microsoft.AspNet.Identity.EntityFramework 中的一些代码,该代码继续使用 System.Data.SqlClient(不确定如何更改)。仍在为这些类生成 SQL 依赖遥测,但当然不包括完整的命令文本,并且仍然具有“rddf:”SDK 版本前缀。

我需要做什么才能获得包含完整命令文本的 SQL 依赖遥测?

一些细节:

  • .NET 框架 4.7.2
  • Microsoft.ApplicationInsights.Web 2.11.2
  • Microsoft.ApplicationInsights.DependencyCollector 2.11.2
  • Microsoft.Data.SqlClient 1.0.19269.1。较新的版本 (1.1.x) 需要更新到 Microsoft.IdentityModel.JsonWebTokens,我目前无法接受。

sql-server asp.net azure sqlclient azure-application-insights

5
推荐指数
1
解决办法
344
查看次数

仅当作为 docker 映像运行时引用 System.Data.SqlClient 时出现 System.PlatformNotSupportedException

System.PlatformNotSupportedException in Microsoft.Data.SqlClient.dll: 'Strings.PlatformNotSupported_DataSqlClient'我正在尝试将我的 azure 函数应用程序作为 docker 映像运行,当我这样做时,每当我尝试调用我的数据层(无论我使用的是 EF Core 还是 Dapper)时,它都会抛出异常。当我将 API 项目设置为启动而不是 docker 映像时,我可以很好地运行该应用程序。

那里有非常相似的问题,但没有一个考虑到它仅在我尝试将其作为 docker 映像运行或我的目标框架是netcoreapp3.1. 我已经尝试过类似问题所说的内容。这是添加System.Data.SqlClient为 Nuget 包,无论我制作什么版本都没有帮助。

我怀疑我需要添加一些东西Dockerfile or something.

这是一些附加信息: 在此输入图像描述

编辑:我可以通过简单地创建一个azure函数、添加docker支持、创建一个在本地数据库上执行CRUD操作的简单数据层、然后运行docker映像并调用执行此操作的端点来在新项目中重新创建该问题CRUD 操作。希望有帮助。

c# sqlclient docker .net-core azure-functions

5
推荐指数
1
解决办法
3598
查看次数