GVKun编程网logo

SqlServer数据库中大对象(text,image)取值错误(sql server image数据类型)

4

本文将带您了解关于SqlServer数据库中大对象的新内容,同时我们还将为您解释text,image取值错误的相关知识,另外,我们还将为您提供关于C#如何把百万级的excel数据导入到sqlserve

本文将带您了解关于SqlServer数据库中大对象的新内容,同时我们还将为您解释text,image取值错误的相关知识,另外,我们还将为您提供关于C#如何把百万级的excel数据导入到sqlserver数据库中去、EXCEL如何导入到SQLServer数据库中、SQL Server ntext、text 和 image、SQL Server不处理NText,Text,Xml或Image数据类型的比较的实用信息。

本文目录一览:

SqlServer数据库中大对象(text,image)取值错误(sql server image数据类型)

SqlServer数据库中大对象(text,image)取值错误(sql server image数据类型)

问题现象:

    客户网站上调用service的信息简要突然变成(net.sourceforge.jtds.jdbc.ClobImpl@57b2dc3),程序没有改动过,现在却失效了。

    跑去jtds官网(http://jtds.sourceforge.net/faq.html)查了一下:程序通过jtds去访问sqlserver数据库时,默认将text/ntext,image等大数据封装成CLOB对象(字符大对象——用来存储单字节的字符数据),而CLOB对象默认没有实现toString()方法,所以直接调用只会打印对象的ID。官方解释是,采用CLOB封装这些对象,对应列的数据无需加载到内存中,如果直接打印出来很容易造成预料外的情况导致内存溢出。

解决方法:

    在配置Recource时,指定数据的链接方式不适用CLOB:

<Resource name="resource_name" auth="Container" type="javax.sql.DataSource" driverClassName="net.sourceforge.jtds.jdbc.Driver" url="jdbc:jtds:sqlserver://yourserver:1433;DatabaseName=dbname;useLOBs=false" username="xx" password="xxxx" maxActive="100" maxIdle="10" maxWait="-1" />

C#如何把百万级的excel数据导入到sqlserver数据库中去

C#如何把百万级的excel数据导入到sqlserver数据库中去

想来大家都有这样的生活常识,一个正常人一顿能吃三个拳头大小的馒头,但是你让他一次性吃三百个馒头,那他撑不死我就表演胸口碎大石…
好了,我们言归正传,在我们处理一个有好几十万条数据的excel表格时,我们的电脑一般都会卡死,甚至会死机。这就是因为我们的数据量太大了,导致我们的计算机内存不足或者溢出(你的电脑只能吃三个馒头,你非让他吃三百个,它能受到了吗?)。所以我们一般的做法是把百万级的数据导入到数据库中去,然后用数据库做处理。可是现在问题来了,我们如何把几百万条数据直接导入到数据库里面去?
常规的Excel数据导入数据库的方法,博主这里就不赘述了,但是常规的方法都有一个绕不过去的坎,就是内存溢出的问题,因为无论前面的步骤如何不同,到最后都是要一次性读取数据,然后就是程序崩溃,电脑卡死的结果。这里我为大家提供一个新的思路,可以用来将百万级的excel数据导入到sqlserver数据库中去。这个思路的核心思想就是分批导入数据+SqlBulkCopy工具
我们的电脑毕竟不是真正的人,它虽然一次性无法吃掉三百个馒头,但是它的“消化功能”非常的好,它吃完三个馒头后就可以立马在吃三个馒头,就这样,我一次吃三个,我吃一百次,我三百个馒头也就吃完了。同样,我一次只导入一万条数据,我一百次就能导入一百万条数据!好了原理就阐述到这里,接下来我们看一下代码部分:


     public void TransferData(string excelFile, string sheetName, string connectionString)
        {
          
         //   try
            {
                string strConn = "";
                //获取全部数据   
                FileInfo file = new FileInfo(excelFile);
                if (!file.Exists) { throw new Exception("文件不存在"); }
                string extension = file.Extension;
                if (extension == ".xls")
                    strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=''Excel 8.0;HDR=Yes;IMEX=1;''", excelFile);
                if (extension == ".xlsx")
                    strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=''Excel 12.0;HDR=Yes;IMEX=1;''", excelFile);
                if (strConn == "") { throw new Exception("excel版本过低,请更换成Office2007以上版本"); }
                OleDbConnection conn = new OleDbConnection(strConn);
                conn.Open();
              string strExcel = "";

                int stat = 0;
                int end = 10000;
                //分批次导入数据
                for (int i = 0; i < 100; i++)// 如果数据量超过一百万,for循环里面的循环次数可以调整一下,当然你可以改一下,获取excel总条数,然后自动的控制循环次数
               
                {
                    strExcel = string.Format(@" select * from [Sheet1$]
               where  id >={0} and id <{1}", stat, end);//这里其实也不完美,这里可以看到博主需要在表列添加一列序号列,用以分割数据,如果有哪位大神可以指点一下,access语法怎么添加一列序号列,小弟不胜感激。(access的语法和sqlserver还是有一些差异的)
               //注意一下excel的sheet名称必须是Sheet1,有人觉得麻烦可以自己改一下代码将表名根据excel实际情况动态获取。
                    stat = stat + 10000;
                    end = end + 10000;
                    OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn);
                    DataSet ds = new DataSet();
                    myCommand.Fill(ds, sheetName);

                    //如果目标表不存在则创建   
                    string strSql = string.Format("if object_id(''{0}'') is null create table {0}(", sheetName);
                    foreach (System.Data.DataColumn c in ds.Tables[0].Columns)
                    {
                        strSql += string.Format("[{0}] varchar(1000),", c.ColumnName);
                    }
                    strSql = strSql.Trim('','') + ")";
                    using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
                    {
                        sqlconn.Open();
                        System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
                        command.CommandText = strSql;
                        command.ExecuteNonQuery();
                        sqlconn.Close();
                    }
                    //用bcp导入数据   
                    using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))
                    {
                        bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
                        bcp.BatchSize = 100;//每次传输的行数   
                        bcp.NotifyAfter = 100;//进度提示的行数   
                        bcp.DestinationTableName = sheetName;//目标表   
                        bcp.WriteToServer(ds.Tables[0]);
                    }
                }

            
                MessageBox.Show("导入成功");
            }
          //  catch (Exception ex)
            {
              //  System.Windows.Forms.MessageBox.Show(ex.Message);
            }
         

        }
             //进度显示   
        void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)
        {
            this.Text = e.RowsCopied.ToString();
            this.Update();
        }

代码大家可以拿去直接用,博主测试了一下40万条数据插入数据库用时三分钟左右。博主逛博客多年,遇到问题总是能在博客找到思路或者答案,在这里首先对这些前辈表示感谢!前人栽树后人乘凉,希望有更多的人能将自己遇到的问题和解决方案共享出来,大家共同进步。赠人玫瑰,手有余香,也祝各位在2020年白白胖胖,充满希望~

EXCEL如何导入到SQLServer数据库中

EXCEL如何导入到SQLServer数据库中

EXCEL数据表怎么导入到sqlServer数据库中?很多朋友并不是很清楚,其实方法很简单的,下面就为大家详细介绍一下,一起来看看吧!

在数据库初始阶段,我们有些数据在EXCEL中做好之后,需要将EXCEL对应列名(导入后对应数据库表的字段名),对应sheet(改名为导入数据库之后的表名)导入指定数据库,相当于导入一张表的整个数据。导入之前需要检查是否存在同名的表,导入的数据表以“$”结尾就是为了避免表重复,以作区分。下面就来看看具体操作步骤。

方法/步骤

打开sql Server Management Studio,按图中的路径进入导入数据界面。

导入的时候需要将EXCEL的文件准备好,不能打开。点击下一步。

数据源:选择“Microsoft Excel”除了EXCEL类型的数据,sql还支持很多其它数据源类型。

选择需要导入的EXCEL文件。点击浏览,找到导入的文件确定。

再次确认文件路径没有问题,点击下一步。

默认为是使用的WINODWS身份验证,改为使用sql身份验证。输入数据库密码,注意:数据库,这里看看是不是导入的数据库。也可以在这里临时改变,选择其它数据库。

选择导入数据EXCEL表内容范围,若有几个SHEET表,或一个SHEET表中有些数据我们不想导入,则可以编写查询指定的数据进行导入。点击下一步。

选择我们需要导入的SHEET表,比如我在这里将SHEET表名改为price,则导入后生面的sql数据库表为price$。点击进入下一步。

点击进入下一步。

在这里完整显示了我们的导入的信息,执行内容,再次确认无误后,点击完成,开始执行。

可以看到任务执行的过程和进度。

执行成功:我们可以看看执行结果,已传输1754行,表示从EXCEL表中导入1754条数据,包括列名标题。这样就完成了,执行SQL查询语句:SELECT * FROM price$就可以查看已导入的数据内容。

以上就是EXCEL数据表怎么导入到sqlServer数据库中方法介绍,大家按照上面步骤进行操作即可,希望能帮到大家!

SQL Server ntext、text 和 image

SQL Server ntext、text 和 image

在 MicrosoftSQL Server 的未来版本中将删除 ntext、text 和 image 数据类型。请避免在新开发工作中使用这些数据类型,并考虑修改当前使用这些数据类型的应用程序。请改用 nvarchar(max)、varchar(max) 和 varbinary(max)。

SQL Server不处理NText,Text,Xml或Image数据类型的比较

SQL Server不处理NText,Text,Xml或Image数据类型的比较

数据绑定转发器时会发生此错误:
sql Server不处理NText,Text,Xml或 Image数据类型的比较
protected void Page_Load(object sender,EventArgs e)
{
    topicid = Convert.ToInt32(Request.QueryString["topic".ToString()]);

    if (!IsPostBack)
    {
        MusicForumDataContext db = new MusicForumDataContext();

        var query = from p in db.posts
                    where p.categoryid == NAME
                    select p;
        rptposts.DataSource = query;
        rptposts.DataBind(); <---- ERROR
    }
}

解决方法

不推荐使用NTEXT,TEXT和Image类型,必须使用NVARCHAR(MAX),VARCHAR(MAX)和VARBINARY(MAX)类型替换它们.新类型支持字符串运算符,包括相等比较.

XML永远不能作为字符串进行比较. XML片段可以用数千种方式编写,并在语义上以相同的XML形式生成.只需考虑命名空间以及如何声明它们,无论如何.

今天关于SqlServer数据库中大对象text,image取值错误的介绍到此结束,谢谢您的阅读,有关C#如何把百万级的excel数据导入到sqlserver数据库中去、EXCEL如何导入到SQLServer数据库中、SQL Server ntext、text 和 image、SQL Server不处理NText,Text,Xml或Image数据类型的比较等更多相关知识的信息可以在本站进行查询。

本文标签: