#c# #database #visual-studio-2015
#c# #База данных #visual-studio-2015
Вопрос:
Я пытаюсь повторно использовать некоторый MySQL в моем проекте Visual Studio 2015 на C #. Я пытаюсь получить выходные данные из базы данных, которые суммируют продажи и общий объем продаж для каждого продавца. При использовании инструкции MySQL, которая отлично работает в моем PHP-проекте, я получаю сообщение об ошибке:
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.
Структура АГЕНТА:
CREATE TABLE [dbo].[AGENT] (
[AgentID] INT IDENTITY (1, 1) NOT NULL,
[AgentName] TEXT NOT NULL,
[OfficeKey] INT NOT NULL,
PRIMARY KEY CLUSTERED ([AgentID] ASC)
);
Структура OFFICE:
CREATE TABLE [dbo].[OFFICE] (
[OfficeID] INT IDENTITY (1, 1) NOT NULL,
[OfficeLocation] NCHAR (20) NOT NULL,
PRIMARY KEY CLUSTERED ([OfficeID] ASC)
);
Структура ПРОДАЖИ:
CREATE TABLE [dbo].[SALE] (
[SaleID] INT IDENTITY (1, 1) NOT NULL,
[SaleDate] DATE NOT NULL,
[AgentKey] INT NOT NULL,
[Amount] MONEY NOT NULL,
[DestinationKey] INT NOT NULL,
PRIMARY KEY CLUSTERED ([SaleID] ASC)
);
Вот мой источник:
namespace Desktop_Campus_Travel
{
public partial class Agent_Bookings : Form
{
public Agent_Bookings()
{
InitializeComponent();
}
private void Agent_Bookings_Load(object sender, EventArgs e)
{
List<AgentBooking> agentList = new List<AgentBooking>();
SqlConnection conn = Database.GetConnection();
string selStmt = @"
SELECT AGENT.AgentName,
OFFICE.OfficeLocation,
COUNT(AGENT.AgentID) AS Sales,
SUM(SALE.Amount) AS Total
FROM AGENT
JOIN OFFICE
ON AGENT.OfficeKey = OFFICE.OfficeID
JOIN SALE
ON SALE.AgentKey = AGENT.AgentID
GROUP BY AGENT.AgentName";
SqlCommand selCmd = new SqlCommand(selStmt, conn);
try
{
conn.Open();
SqlDataReader reader = selCmd.ExecuteReader();
while (reader.Read())
{
AgentBooking agent = new AgentBooking();
agent.AgentName = reader["AgentName"].ToString();
agent.OfficeLocation = reader["OfficeLocation"].ToString();
agent.Sales = reader["Sales"].ToString();
agent.Total = reader["Total"].ToString();
agentList.Add(agent);
}
reader.Close();
}
catch (SqlException ex) { throw ex; }
finally { conn.Close(); }
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
Комментарии:
1. Сумма должна быть
money
, а неNCHAR
. Суммирование в строке не имеет смысла. MySQL рад сделать все возможное, чтобы получить результат, а не выдавать ошибку. SQL Server этого не делает.2. Я попытался изменить тип столбца на
money
, но я остался с тем же сообщением об ошибке.3. Также дайте нам определения таблиц AGENT и OFFICE…
4. Вы пытаетесь сгруппировать по
AGENT.AgentName
, а типText
. Попробуйте изменить его наnvarchar(100)
. Sql Server не согласен группировать поText
типу данных.5. Еще один, вы группируете по
AGENT.AgentName
, а затем пытаетесь выбратьOFFICE.OfficeLocation
. Это также не будет работать в Sql Server.
Ответ №1:
Шаг 1
Измените свою таблицу агентов на
CREATE TABLE [dbo].[AGENT] (
[AgentID] INT IDENTITY (1, 1) NOT NULL,
[AgentName] NVARCHAR(100) NOT NULL,
[OfficeKey] INT NOT NULL,
PRIMARY KEY CLUSTERED ([AgentID] ASC)
);
SQL Server не устраивает GROUP BY
TEXT
тип данных.
Шаг 2
Измените свой запрос на
SELECT
AGENT.AgentName,
OFFICE.OfficeLocation,
SALE2.Sales,
SALE2.Total
FROM
AGENT
JOIN OFFICE ON AGENT.OfficeKey = OFFICE.OfficeID
JOIN
(
SELECT
SALE.AgentKey,
COUNT(SALE.SaleID) AS Sales,
SUM(SALE.Amount) AS Total
FROM SALE
GROUP BY SALE.AgentKey
) SALE2 ON SALE2.AgentKey = AGENT.AgentID
SQL Server также не рад выбирать столбец, который не содержится ни в агрегатной функции, ни в GROUP BY
предложении при GROUP BY
использовании.
Вы можете выполнить только шаг 2, не выполняя шаг 1, и это сработает, но Text
тип данных устарел (ссылка на MSDN), поэтому вам не следует его использовать.
Комментарии:
1. Это устранило проблемы, с которыми я сталкивался, спасибо за объяснение логики. =)