Dahlin's point streak ended at five games, tied for the longest in NHL history for an 18-year-old defenseman with Aaron Ekblad, Phil Housley and Bobby Orr (twice).
Brock Boeser had a goal and an assist, Alexander Edler and Sven Baertschi scored, and Bo Horvat had two assists for the Canucks (22-21-6), who have a four-game point streak (2-0-2).
"These are meaningful games, and [Demko] stepped up like great players do and he played phenomenal," Horvat said. "We owe him a lot of credit."
Rodrigues, Kyle Okposo and Sam Reinhart scored, and Linus Ullmark made 19 saves for the Sabres (24-18-6), who have one win in their past five games.
"I thought we played a really good game tonight and mistakes cost us," Okposo said. "We created plenty to win that game. They capitalized on our mistakes, and [Demko] made a couple great saves."
The Sabres had the first seven shots on goal, and Rodrigues gave them a 1-0 lead at 8:48 of the first with a backdoor tap-in after Rasmus Ristolainen used his skate to redirect a pass into the slot.
The Canucks got their first shot at 9:30, and Edler tied it 1-1 on their third at 12:12 with a low point shot into traffic.
Baertschi made it 2-1 on Vancouver's next shot at 15:31, finishing a backdoor pass from Derrick Pouliot after he split the defense on a solo rush.
"I loved the way we started the game," said Housley, in his second season as Buffalo coach. "We were in the offensive zone, we were making plays, we were executing well, we were getting a lot of looks, and then we give up those two goals and it's more of just sorting things out in our own end."
Okposo tied it 2-2 at 2:26 of the second period with a backhand from in close.
Boeser made it 3-2 at 8:00 on a backdoor tap-in after defenseman Lawrence Pilut's blind backhand pass went right to Horvat between the top of the face-off circles.
Reinhart tied it 3-3 at 12:52 on a spinning backhand after being left alone in front of Demko.