小编Shd*_*dNx的帖子

LINQ to SQL - 数据库生成一个已在使用的密钥

我有一个简单的问题,即读取Excel文件(使用互操作)并使用从中提取的一些数据填充MSSQL数据库文件.到目前为止这很好.我有一个Shops表,其中包含以下字段:

  • ID:int,自动生成,自动同步:插入
  • 名称:字符串
  • 结算:字符串
  • 县:字符串
  • 地址:字符串

我阅读了excel文件,然后创建了一个新的Shops对象并设置了Name,Settlement,County和Address属性,并使用新的Shops对象调用Shops.InsertOnSubmit().

在此之后我必须重置数据库(至少是表),我发现最简单的方法是调用DeleteDatabase()方法,然后再次调用CreateDatabase().问题是,在第一次重置后,当我再次尝试填充表时,我得到异常:数据库生成了一个已经在使用的密钥.

另外,从那时起,我无法使用该数据库文件,因为DatabaseExists()返回FALSE,但是当我调用CreateDatabase()方法时,它抛出一个异常,数据库已经存在(尽管数据文件没有不存在).

我究竟做错了什么?非常感谢你提前!

c# sql-server linq-to-sql

6
推荐指数
1
解决办法
3116
查看次数

CMake项目共享依赖项

我有:

  • 共享库X,它是独立的
  • 共享库Y,使用X
  • 可执行文件Z,同时使用X和Y

它们都有自己的CMakeLists.txt,可以独立配置和构建。

但是,我无法使CMakeLists.txt可执行文件(Z)正常工作。

我的方法是这样的:

foreach(clib ${OWN_LIBS})
   set(LIBS "${LIBS} ${clib}")
   set(CLIB_DIR "${PROJECT_SOURCE_DIR}/../lib${clib}")
   set(CLIB_BUILD_DIR "${CLIB_DIR}/build")

   add_subdirectory("${CLIB_DIR}" "${CLIB_BUILD_DIR}")
   include_directories("${CLIB_DIR}/incl")
   link_directories("${CLIB_BUILD_DIR}")
endforeach(clib)
Run Code Online (Sandbox Code Playgroud)

OWN_LIBS在项目Y中只是“ X”,而在项目Z中是“ X Y”。

这适用于项目Y,但在项目Z中,我得到:

...(add_subdirectory)处的CMake错误:二进制目录

.../libX/build
Run Code Online (Sandbox Code Playgroud)

已经用于构建源目录。它不能用于构建源目录

.../libX
Run Code Online (Sandbox Code Playgroud)

指定唯一的二进制目录名称。

我还尝试尝试创建本地构建目录,例如,将存在libY / build / deps-libX /,其中包含已配置和构建的库X(从Y使用时),而Z具有X和Y的库。 ,接下来我遇到了:

add_library无法创建目标“ X”,因为已经存在另一个具有相同名称的目标。现有目标是在源目录“ libX”中创建的共享库。有关更多详细信息,请参阅策略CMP0002的文档。

不能使用ExternalProject。

cmake

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

HttpWebResponse.GetResponseStream():何时传输响应体?

我正在使用System.Net.HttpWebRequest类来实现一个简单的HTTP下载器,它可以在被取消后暂停,取消甚至恢复(使用HTTP Range请求头).

很明显,HttpWebRequest.GetResponse()是HTTP请求实际发送到服务器的时候,并且该方法在收到HTTP响应(或发生超时)时返回.但是,响应主体用Stream表示,这让我想知道响应主体是否实际上与响应头一起传输(即,当GetResponse()返回时它已经下载),或者只是按需下载,当我尝试时从响应流中读取?或者当我调用HttpWebResponse.GetResponseStream()方法时?

不幸的是,msdn文档没有说明,我对HTTP协议的了解还不够.

在这种情况下,如何进行分块传输等(也就是说,我应该如何在C#应用程序中处理它们)?什么时候实际上是从服务器下载的响应数据?

.net c# http httpwebrequest

4
推荐指数
1
解决办法
1677
查看次数

.NET取消异步I/O操作

在这种特殊情况下,我正在编写TCP/IP服务器,而我正在使用TcpListener.BeginAcceptTcpClient()来接受传入连接.服务器逻辑在实现IDisposable接口的单个​​类中实现:当调用Dispose()时,我想取消BeginAcceptTcpClient()操作.

现在用更一般的术语来说:当使用.NET 的异步I/O模型(Begin*和End*)时,如何取消操作?

我的想法是这样的:

private volatile bool canceledFlag = false;

this.listener.BeginAcceptTcpClient(asyncResult =>
{
    if(this.canceledFlag) return;

    // ...
}, null);
Run Code Online (Sandbox Code Playgroud)

Dispose()会将标志设置为true,并且还会调用this.listener.Stop().但是我记得已经读过,对于每个Begin*调用必须有匹配的End*调用或者会发生不好的事情.

那我该怎么做呢?请注意,我正在寻找一个使用Begin*和End*方法取消的一般解决方案 - 我只是给了你具体的使用场景,以帮助你理解我的问题.

.net c# io asynchronous

4
推荐指数
1
解决办法
2056
查看次数

枚举信号参数

我正在尝试使用Qt的信号和插槽机制和自定义枚举类型.

我已经阅读了以下所有内容,但没有一个有用:

DetectorEngineThread.h:

class DetectorEngineThread : public QThread
{
    Q_OBJECT
    Q_ENUMS(ErrorCode)
    Q_ENUMS(Status)

public:
    enum ErrorCode
    {
        ...
    };

    enum Status
    {
        ...
    };
...

signals:
    void statusChanged(Status newStatus);
    void processingError(ErrorCode code);
};

Q_DECLARE_METATYPE(DetectorEngineThread::ErrorCode)
Q_DECLARE_METATYPE(DetectorEngineThread::Status)
Run Code Online (Sandbox Code Playgroud)

MainWindow.h:

...
#include "DetectorEngineThread.h"
...

class MainWindow : public QMainWindow
{
    Q_OBJECT
    ...

private:
    DetectorEngineThread* m_detEng;
    ...

private slots:
    void on_detEng_statusChanged(DetectorEngineThread::Status newStatus);
    void on_detEng_processingError(DetectorEngineThread::ErrorCode errorCode);
    ...
};
Run Code Online (Sandbox Code Playgroud)

MainWindow.cpp:

...
#include "MainWindow.h"
...

MainWindow::MainWindow(...) : ...
{
    ...
    qRegisterMetaType<DetectorEngineThread::Status>("DetectorEngineThread::Status");
    qRegisterMetaType<DetectorEngineThread::ErrorCode>("DetectorEngineThread::ErrorCode");
    ...

    m_detEng …
Run Code Online (Sandbox Code Playgroud)

c++ qt signals-slots

4
推荐指数
1
解决办法
3643
查看次数

SQL Server:加载数据库文件

我正在使用SQL Server 2008.我应该能够"连接"到用户指定的数据库文件(mdf)(使用连接字符串的AttachDbFilename部分)并保存所选文件的副本.我还必须处理数据库的内容.

如果我做对了,一个mdf文件代表一个包含表,存储过程等的完整数据库.但是,如果我在不同文件夹中有两个同名文件(一个在SQL Server的DATA文件夹中,另一个在C :)的根,我尝试在C下加载文件:我收到一条错误,指出已存在具有该名称的数据库.

我在C:下重命名了该文件,但现在我收到一个错误:

"尝试打开或创建物理文件'C:/myDatabaseFile_log.ldf'时,CREATE FILE遇到操作系统错误5(无法检索此错误的文本.原因:15105).无法打开新数据库'C:/MYDATABASEFILE.MDF '.CREATE DATABASE被中止.尝试为文件'C:/myDatabaseFile.mdf'附加一个自动命名的数据库失败.存在一个同名的数据库或指定的文件无法打开,或者它位于UNC共享上."

请注意:我正在尝试打开数据库而不是尝试创建它.
那么我做错了什么?我误解了什么吗?这些数据库文件如何工作(我的意思是,如何使用它们)?

sql-server sql-server-2008

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

AutoResetEvent未正确阻止

我有一个线程,它创建可变数量的工作线程并在它们之间分配任务.这是通过向线程传递一个TaskQueue对象来解决的,您将在下面看到它的实现.

这些工作线程只是迭代它们给出的TaskQueue对象,执行每个任务.

private class TaskQueue : IEnumerable<Task>
{
    public int Count
    {
        get
        {
            lock(this.tasks)
            {
                return this.tasks.Count;
            }
        }
    }

    private readonly Queue<Task> tasks = new Queue<Task>();
    private readonly AutoResetEvent taskWaitHandle = new AutoResetEvent(false);

    private bool isFinishing = false;
    private bool isFinished = false;

    public void Enqueue(Task task)
    {
        Log.Trace("Entering Enqueue, lock...");
        lock(this.tasks)
        {
            Log.Trace("Adding task, current count = {0}...", Count);
            this.tasks.Enqueue(task);

            if (Count == 1)
            {
                Log.Trace("Count = 1, so setting the wait handle..."); …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading autoresetevent

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